C++,2D std::vector,我是不是需要明确保留和推回空向量?

Posted

技术标签:

【中文标题】C++,2D std::vector,我是不是需要明确保留和推回空向量?【英文标题】: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>());

谢谢

【问题讨论】:

【参考方案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 会更好

【讨论】:

以上是关于C++,2D std::vector,我是不是需要明确保留和推回空向量?的主要内容,如果未能解决你的问题,请参考以下文章

将元素从 std::vector 复制到 std::stack c++

C++ std::vector 乘法中是不是存在已知的不一致行为?

如何在 C++ 中声明和初始化 2d int 向量?

如何初始化 2D 向量 C++ [重复]

在 C++ 中检查 std::vector<string> 是不是包含某个值 [重复]

用户将元素输入到二维向量c++中