Правильно ли это поведение vector :: resize (size_type n) в C ++ 11 и Boost.Container?

У меня есть приложение C ++ 03, гдеstd::vector типы используются повсеместно как временные буферы. Как таковые, они часто меняются с помощьюstd::vector::resize() чтобы убедиться, что они достаточно велики, чтобы хранить необходимые данные перед использованием. Прототип C ++ 03 для этой функции на самом деле:

void resize(size_type n, value_type val = value_type());

Так на самом деле при звонкеresize(), вектор увеличивается путем добавления соответствующего числа копийval, Однако часто мне просто нужно знать, чтоvector достаточно большой, чтобы вместить нужные мне данные; Я неЭто нужно инициализировать с любым значением. Создание копий новых значений - просто трата времени.

C ++ 11 приходит на помощь (я думал): в своей спецификации он расщепляетсяresize() на две перегрузки:

void resize(size_type n); // value initialization
void resize(size_type n, const value_type &val); // initialization via copy

Это прекрасно вписывается в философию C ++: платите только за то, что вы хотите. Как я уже заметил, мое приложение можетя не использовал C ++ 11, поэтому я был счастлив, когда наткнулся на библиотеку Boost.Container, котораяуказывает на поддержку этой функциональности в своей документации. В частности,boost::container::vector на самом деле имеет три перегрузки:resize()

void resize(size_type n); // value initialization
void resize(size_type n, default_init_t); // default initialization
void resize(size_type n, const value_type &val); // initialization via copy

Чтобы убедиться, что я все понял, я сделал быстрый тест, чтобы проверить поведение C ++ 11std::vector а также :boost::container::vector

#include 
#include 
#include 

using namespace std;
namespace bc = boost::container;

template 
void init_vec(VecType &v)
{
    // fill v with values [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    for (size_t i = 0; i < 10; ++i) v.push_back(i);
    // chop off the end of v, which now should be [1, 2, 3, 4, 5], but the other 5 values
    // should remain in memory
    v.resize(5);
}

template 
void print_vec(const char *label, VecType &v)
{
    cout < label < ": ";
    for (size_t i = 0; i < v.size(); ++i)
    {
        cout < v[i] < ' ';
    }
    cout < endl;
}

int main()
{
    // instantiate a vector of each type that we're going to test
    std::vector

Ответы на вопрос(6)

Ваш ответ на вопрос