std::vector::reserve
Материал из cppreference.com
|
|
Эта страница была переведена автоматически с английской версии вики используя Переводчик Google. Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Щёлкните здесь, чтобы увидеть английскую версию этой страницы. (Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке.) |
<metanoindex/>
<tbody> </tbody> void reserve( size_type new_cap ); |
||
Увеличьте емкость вектора до значения, которое больше или равно
new_cap. Если new_cap больше, чем текущая std::vector::capacity() , выделяется новое хранилище, в противном случае функция ничего не делает. Новая память выделяется при необходимости. Оригинал:
{{{2}}}
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Параметры
| new_cap | — | резервирование памяти для вектора
Оригинал: new capacity of the container Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
Возвращаемое значение
(Нет)
Исключения
- std::length_error if
new_cap > max_size().
Сложность
линейные по размеру контейнера
Оригинал:
linear in the size of the container
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Пример
Запустить этот код
#include <cstddef>
#include <iostream>
#include <new>
#include <vector>
// минимальный распределитель с выводом отладки С++11
template <class Tp>
struct NAlloc {
typedef Tp value_type;
NAlloc() = default;
template <class T> NAlloc(const NAlloc<T>&) {}
Tp* allocate(std::size_t n)
{
n *= sizeof(Tp);
Tp* p = static_cast<Tp*>(::operator new(n));
std::cout << "распределение " << n << " bytes @ " << p << '\n';
return p;
}
void deallocate(Tp* p, std::size_t n)
{
std::cout << "освобождение " << n*sizeof*p << " bytes @ " << p << "\n\n";
::operator delete(p);
}
};
template <class T, class U>
bool operator==(const NAlloc<T>&, const NAlloc<U>&) { return true; }
template <class T, class U>
bool operator!=(const NAlloc<T>&, const NAlloc<U>&) { return false; }
int main()
{
constexpr int max_elements = 32;
std::cout << "использует резерв: \n";
{
std::vector<int, NAlloc<int>> v1;
v1.reserve( max_elements ); // Резервирует как минимум * sizeof(int) bytes
for(int n = 0; n < max_elements; ++n)
v1.push_back(n);
}
std::cout << "не использует резерв: \n";
{
std::vector<int, NAlloc<int>> v1;
for(int n = 0; n < max_elements; ++n) {
if(v1.size() == v1.capacity()) {
std::cout << "size() == capacity() == " << v1.size() << '\n';
}
v1.push_back(n);
}
}
}
Возможный вывод:
с использованием резерва:
распределение 128 bytes @ 0xa6f840
освобождение 128 bytes @ 0xa6f840
без использования резерва:
size() == capacity() == 0
распределение 4 bytes @ 0xa6f840
size() == capacity() == 1
распределение 8 bytes @ 0xa6f860
освобождение 4 bytes @ 0xa6f840
size() == capacity() == 2
распределение 16 bytes @ 0xa6f840
освобождение 8 bytes @ 0xa6f860
size() == capacity() == 4
распределение 32 bytes @ 0xa6f880
освобождение 16 bytes @ 0xa6f840
size() == capacity() == 8
распределение 64 bytes @ 0xa6f8b0
освобождение 32 bytes @ 0xa6f880
size() == capacity() == 16
распределение 128 bytes @ 0xa6f900
освобождение 64 bytes @ 0xa6f8b0
освобождение 128 bytes @ 0xa6f900
См. также
| возвращает количество элементов, которые могут храниться в выделенной в данный момент памяти (public функция-элемент) |