close
Пространства имён
Варианты
Действия

std::vector::reserve

Материал из cppreference.com

<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 функция-элемент) [править]