Правильно ли это поведение 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