初始化具有保留向量的向量的向量

Hum*_*awi 4 c++ vector c++11

我有一个矢量矢量:

std::vector<std::vector<T>> v;
Run Code Online (Sandbox Code Playgroud)

我想用5个项目(T的5个向量)初始化这个向量.这些向量中的每一个将包含0到10个项目.显然,我需要使用10 保留内部向量而不是使用10进行大小调整.我不需要进行不必要的重新分配或复制.换句话说,我需要安装施工.

由于std::vector没有为构造函数提供所需数量的项目,我提出了这个想法:

std::vector<std::vector<T>> v(5,
    [](){
            std::vector<T> temp;
            temp.reserve(10);
            return temp;
    }());
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 有效吗?这是否包含未定义的行为?
  2. 我是否真的最大限度地减少了执行上述操作所需的资源?我觉得我的方法中有不必要的副本.

krz*_*zaq 5

  1. 没有效果,但它没有做你想要的.据我所知,这里没有未定义的行为.
  2. 如果优化程序执行不当,可能会有一个不必要的副本.

话虽这么说,你根本就没有做你打算做的事情.如果您检查capacity()v的元素,你会发现他们不设置10.那是因为vector没有定义复制构造函数来逐字复制容器 - 它复制了它的元素.

要做你想做的事,你需要reserve()在构造这些向量后调用:

std::vector<std::vector<T>> v(5);
for(auto& vec : v) {
    vec.reserve(10);
}
Run Code Online (Sandbox Code Playgroud)

它具有更少的代码和更易读的额外好处.