使用保留向量

时间:2016-11-07 17:53:09

标签: c++ c++11 vector

我有一个向量载体:

std::vector<std::vector<T>> v;

我想用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;
    }());

问题:

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

1 个答案:

答案 0 :(得分:5)

  1. 没有效果,但它没有做你想要的。据我所知,这里没有未定义的行为。
  2. 如果优化程序执行不当,可能会有一个不必要的副本。
  3. 话虽如此,你根本没有按照你的目的去做。如果您检查capacity()v个元素,则会看到它们未设置为10。那是因为vector的复制构造函数没有被定义为逐字复制容器 - 它复制了它的元素。

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

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

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