【问题标题】:C++, 2D std::vector, do I need to explicitly reserve and push back empty vectors?C++,2D std::vector,我是否需要明确保留和推回空向量?
【发布时间】:2017-11-10 13:23:02
【问题描述】:

当我制作一个 2D 矢量时。 std::vector<std::vector<Pokemon>> pokemons;

我可以直接运行吗: Pokemon pikachu = ... pokemons[23].push_back(Pikachu);

或者我需要: pokemons.reserve(100); for (int i =0;i<100;i++) pokemons.push_back(vector<Pokemon>());

谢谢

【问题讨论】:

    标签: c++ vector


    【解决方案1】:

    构造时可以设置外层向量的初始大小

    std::vector<std::vector<Pokemon>> pokemons(100);
    

    它将构建 100 个内部空向量。

    【讨论】:

    • 谢谢,但是如果我已经声明了怎么办?例如:std::vector&lt;std::vector&lt;Pokemon&gt;&gt; pokemons; 已在代码中的其他位置设置。
    • 向量有一个resize 函数,你可以使用它来给它一个新的大小,比当前大小更大或更小。您可以查看cppreference.com 以获取大量 C++ 参考信息。
    【解决方案2】:

    我可以直接运行吗:

    Pokemon pikachu = ...
    pokemons[23].push_back(Pikachu);
    

    不是马上,因为您的pokemons 数组还没有任何元素,所以pokemons[23] 将是一个越界错误。

    否则,一旦您的 pokemons 数组被填充,那么是的,您可以只在其中一个元素上使用 push_back

    或者我需要:

    pokemons.reserve(100);
    for (int i =0;i<100;i++) pokemons.push_back(vector<Pokemon>());
    

    reserve() 只是为你的向量分配(保留)内存,如果你知道你最终将拥有多少个元素,以避免多次内存分配和潜在的移动。您需要reserve(),但如果您需要大量的内存是个好主意。

    【讨论】:

      【解决方案3】:

      您确定向量是您正在寻找的最合适的容器吗? 检查How can I efficiently select a Standard Library container in C++11?

      如果 '23' 真的很重要,那么您可以例如使用关联容器:

       typedef std::map<int, pokemon> TPokemons;
       TPokemons pokemons;
       pokemons[23] = pikachu;
      

      也许顺序并不重要,unordered map 会更好

      【讨论】:

        猜你喜欢
        • 2012-10-19
        • 2018-10-23
        • 2017-05-27
        • 2012-05-31
        • 2014-02-18
        • 1970-01-01
        • 2012-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多