【问题标题】:Reseve memory for inner vector in a std::vector<std::vector<TYPE>>为 std::vector<std::vector<TYPE>> 中的内部向量保留内存
【发布时间】:2018-10-23 19:34:30
【问题描述】:

我喜欢为std::vector&lt;std::vector&lt;TYPE&gt;&gt; 中的内部向量保留内存,以避免在随后的push_back 中分配大量单个内存。我不知道向量的innerSize到底是什么,但我可以给出一个很好的估计。

std::resize可以用作

vecs.resize(outerSize, std::vector<TYPE>(innerSize));

其中outerSizeinnerSize 是整数。这对我不起作用,因为默认构造函数不适用。但是std::reserve 没有提供这样的接口。

这是为所有内部向量保留内存的好方法吗?

vecs.resize(outerSize);
for (auto &elem : vecs) {
    elem.reserve(innerSize);
}

【问题讨论】:

  • 是的,这是个好办法。
  • 您的循环似乎是更好的方法。我什至认为vecs.resize(outerSize, vector_with_reserved_size); 并不能保证构建具有正确容量的内部向量。
  • 请注意,vecs.resize(outerSize, std::vector&lt;TYPE&gt;(innerSize)); 与您拥有的 reserve 循环非常不同。前者将使用默认构造函数初始化每个内部向量。如果TYPE 很大,最终将花费比reserve 循环更长的时间。编辑:稍后您必须替换现有的TYPE 项目,而不是调用push_back

标签: c++ c++11 vector memory-management


【解决方案1】:

我能想到的唯一选择是围绕内部std::vector 创建一个包装类;将其保留在施工中。导致类似的事情

struct TableRow {
    std::vector<TYPE> data;
    TableRow() {
        data.reserve(SIZE);
    }
}

std::vector<TableRow> myVectorOfVectors;

这样做的另一个好处是你的内部向量得到了一个你可以理解的名字(比如TableRow);但缺点是除非你愿意玩继承std::vector 的游戏(如果有疑问;不要这样做);您对 wrapper 类的使用会有些尴尬,因为您需要添加 .data 或类似的东西。

正如其他人所说的那样;你的方法很好。

【讨论】:

    【解决方案2】:

    是的,您的尝试是一个很好的解决方案,即使不是最好的:

    #include <vector>
    
    std::vector<std::vector<NonDefaultConstructible>> vecs;
    vecs.resize(outerSize);
    for (auto &elem : vecs) {
        elem.reserve(innerSize);
    }
    

    改进它的唯一方法是需要一个 std::vector 的构造函数,它接受一个容量并构造一个大小为零的向量并提供容量。这样的构造函数does not exist

    【讨论】:

      猜你喜欢
      • 2019-10-27
      • 1970-01-01
      • 2015-04-08
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多