当我提前知道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,这不是问题的关键。
答案 0 :(得分:6)
你根本不需要循环。有std::vector
构造函数的重载需要两个迭代器。因此,只需使用std::begin
和std::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
实际上将在向量中就地创建。没有更快的方法。