按容量迭代std :: vector

lor*_*ova 0 c++ stdvector

当我std::vector提前知道最终大小时,我通常会提前保留其容量以避免重新分配其内容(在C++ 03上涉及为已存储在其中的每个对象调用复制构造函数vector).

这是一个简单的例子:

std::vector<std::string> v;
v.reserve(10);    

for( std::vector<std::string>::size_type i = 0, capacity = v.capacity();
     i < capacity;
     ++i )
{
    v.push_back(std::to_string(i));
}
Run Code Online (Sandbox Code Playgroud)

循环std::vector容量有更好的方式(更少的C风格)?

我正在寻找C++ 03和C++ 11的答案.

编辑:我重写了样本,因为所有的答案和评论都是关于主题的,只关于用数组填充std :: vector,这不是问题的关键.

Cor*_*mer 6

你根本不需要循环.std::vector构造函数的重载需要两个迭代器.因此,只需使用std::beginstd::next获取传入数组的开始和结束,并从中创建一个向量.

template<typename T>
std::vector<T> fill(const T* t, size_t size)
{
    return {std::begin(t), std::next(std::begin(t), size)};
}
Run Code Online (Sandbox Code Playgroud)

类似地,你可以使用指针算法,这是上面的方法基本上在幕后做的事情:

template<typename T>
std::vector<T> fill(const T* t, size_t size)
{
    return {t, t + size};
}
Run Code Online (Sandbox Code Playgroud)

  • @Sergey - 如果向量构造函数比使用保留更差,你应该向图书馆开发人员索要钱. (2认同)