代码之家  ›  专栏  ›  技术社区  ›  Eric Auld

为双向量保留空间

  •  0
  • Eric Auld  · 技术社区  · 7 年前

    认为 T 是一种类型,我想做一个 vector<vector<T>> .我知道最终的尺寸是 m x n 哪里 m n 是运行时常量。(如果它们是编译时常量,我会使用 std::array<std::array<T, n>, m> )假设在我认真继续我的程序之前,我有三个选择来处理我的双向量:

    选项1

    std::vector<std::vector<T>> dbl_vect(m);
    for (auto & v : dbl_vect)
        v.reserve(n);
    

    选择2

    std::vector<std::vector<T>> dbl_vect;
    dbl_vect.reserve(m);
    

    选项3

    std::vector<std::vector<T>> dbl_vect;
    

    假设我不担心迭代器&向量重新分配中的引用无效,所以我们可以从决策过程中删除它。

    当然,后面的代码必须有所不同,因为#1创建dbl_向量的(空)行,所以我们必须访问这些行,而不是向后推。

    选项#2似乎相当无用,因为它不知道为每行保留多少空间。

    选项#1要求我通过 M 清空向量并手动调整大小,但这会阻止重新分配。如果 T 如果规模相当大,我相信这几乎肯定会更可取,因为这样可以防止复制/移动。

    问题: 认为 T = char (或者选择你最喜欢的豆荚类型)。在什么情况下,我应该对选项1和3漠不关心,甚至更喜欢#3?这主要是因为一个相对较小的 char ,或者因为编译器将(不)默认初始化 烧焦 ? 如果 T 更大,可能是用户定义的,在什么点(在双向量的大小或 T )我应该开始关心吗?

    Here 有人问了一个类似的问题,关于一个向量和 T=int .

    1 回复  |  直到 7 年前
        1
  •  0
  •   Eric Auld    7 年前

    如果你知道内部尺寸 m ,一种可能性是 std::vector<S> 哪里 S 你的自定义类型代表a吗 std::vector<T> ,但它知道它将有多少个条目。提出了类似的解决方案 here (除了那里 M 是编译时常量)。

        2
  •  -2
  •   Krystian S    7 年前

    #3.just default初始化向量。你从中得不到任何好处,因为包含向量的容量为零。动态分配内存很慢,所以为了最小化这一点,我总是使用#1或其变体。

    推荐文章