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<std::vector<Pokemon>> 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 乘法中是不是存在已知的不一致行为?