用保留向量初始化向量的向量

Initialize vector of vectors with reserved vector

本文关键字:向量 初始化 保留      更新时间:2023-10-16

我有一个向量的向量:

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. 不是无效的,但它不做你想要的。据我所知,这里没有未定义行为。
  2. 如果优化器执行不好,可能会有一个不必要的副本。
那就是说,你根本没有做你打算做的事。如果你检查v元素的capacity(),你会看到它们没有被设置为10。这是因为vector的复制构造函数没有被定义为逐字复制容器——它复制容器的元素。

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

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

它的额外好处是代码更少,可读性更强。