最快的方法是什么:
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);
然后,v
向量大小为5且每个v[i]
为空双向量,容量为10.
答案 0 :(得分:2)
您的解决方案几乎和它一样好。你可以把它调整为:
template<typename T>
vector<vector<T>> vec_vec_init(T dummy, size_t outer_dim, size_t inner_dim) {
vector<vector<T>> v(outer_dim);
for (auto &inner: v)
inner.reserve(inner_dim);
return v;
}
感觉喜欢:
vector<vector<T>> vec_vec_init(T dummy, size_t outer_dim, size_t inner_dim) {
vector<T> reserved;
reserved.reserve(inner_dim);
vector<vector<T>> v(outer_dim, reserved);
return v;
}
应该有用(它会创建v
outer_dim
个reserved
个副本。问题是std::vector
的复制构造函数不(必然)保留容量。因此,您可以保证获得outer_dim
空向量。
顺便说一句,我会从调用序列中删除dummy_for_size
,并调用
auto vv = vec_vec_init<float>( 100*1000, 10 );
答案 1 :(得分:2)
我不可能保证最快&#34;但我可能会做这样的事情(假设是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
无法初始化为{{1} } {} 0
。在C ++ 11之前,我不会打扰使用这样的函数,因为它会按值返回。保证按值复制向量可保留大小(除非复制失败,并抛出异常),但不保证保留容量。在这种情况下,这也适用于内部向量。
所以我可能完全放弃这个功能
vec_vec_init(dummy_Something, outer, inner)
或(如果我要求代码在C ++ 11之前工作)
std::vector<std::vector<Something> > v(outer);
for (auto &i : v) i.reserve(inner);