初始化vector <vector <double>&gt;的最快方法大小为0,具有固定容量

时间:2017-01-05 07:34:43

标签: c++ vector

最快的方法是什么:

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.

2 个答案:

答案 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_dimreserved个副本。问题是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);