按容量迭代std :: vector

时间:2015-12-31 18:26:57

标签: 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));
}

围绕std::vector容量循环有更好的方法(减少C风格)?

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

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

2 个答案:

答案 0 :(得分: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)};
}

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

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

答案 1 :(得分:0)

在c ++ 11或更高版本中,如果填充向量,知道其大小std::initializer_list将是您最好的选择。

您可能希望避免通过指向const对象数组的指针进行初始化,因为这几乎可以保证复制。我很欣赏这在c ++ 03中是必要的,如果可能的话,这应该是你转向更新编译器的主要动机之一。

这样:

std::vector<Thing> mythings { Thing(1), Thing(2), Thing(3) };

尽可能快地得到它。 (并不是说不需要填充功能)。

如果在具有优化功能的相当现代的编译器上编译它,您会发现Thing实际上将在向量中就地创建。没有更快的方法。