最快的方法是什么:
template<typename T>
vector<vector<T>> vec_vec_init(T dummy_for_type, size_t outer_dim, size_t inner_dim) {
vector<vector<T>> v(outer_dim);
for (size_t i = 0; i < outer_dim; i++)
v[i].reserve(inner_dim);
return v;
}
即如果我有
vector<vector<double>> v = vec_vec_init((double)0, 5, 10);
然后,大小为 5 的 v
vector 和每个 v[i]
都是容量为 10 的空 double vector 。
最佳答案
实际上不可能保证“最快”,但我可能会做这样的事情(假设 C++11 或更高版本)
template<typename T>
std::vector<std::vector<T> > vec_vec_init(std::size_t outer_dim, std::size_t inner_dim)
{
std::vector<std::vector<T> > v(std::vector<T>(0), outer_dim);
for (auto &i : v) i.reserve(inner_dim);
return v;
}
备注;
- 我添加了
std::
命名空间std
中那些东西的前缀,因为像这样的模板函数可能会在头文件中定义。有许多解释(在 SO 和其他地方,使用谷歌很容易找到)解释为什么using namespace std;
在头文件中是个坏主意。 - 这使用迭代器,它有潜力(不能保证,但通常是公平的赌注)提供比标准容器上的数组索引更好的性能。主观上,很多程序员(至少,一旦他们掌握了使用迭代器的诀窍)也发现迭代器比数组索引更容易使用。
- 我已经删除了
dummy_for_type
争论,因为我认为像v = vec_vec_init<Something>(outer, inner)
这样的电话比v = vec_vec_init(Something(0), outer, inner)
更清晰或者(如果Something
不能初始化为0
)vec_vec_init(dummy_Something, outer, inner)
.
在 C++11 之前,我不会费心使用这样的函数,因为它会按值返回。按值复制 vector 可以保证保留大小(除非复制失败并抛出异常)但不能保证保留容量。在这种情况下,这也适用于内部 vector 。
所以我可能会完全取消该功能,只需这样做
std::vector<std::vector<Something> > v(outer);
for (auto &i : v) i.reserve(inner);
或者(如果我要求代码在 C++11 之前工作)
std::vector<std::vector<Something> > v(outer);
std::vector<std::vector<Something> >::iterator i = v.begin(), end = v.end();
while (i != end)
{
i->reserve(inner);
++i;
}
关于c++ - 以固定容量初始化大小为 0 的 vector<vector<double>> 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41479535/