【发布时间】:2017-03-01 10:54:43
【问题描述】:
在我的场景中,我有一个std::map<std::string, std::vector<cCustomClass> >,但同样的问题也适用于std::set。这些向量可能会变得非常大(超过 100000 个元素),因此我担心如果向地图添加更多元素,是否会重新分配或复制向量。
核心问题是:地图会在某个时候复制大向量吗?如果是,它的成本是否与std::vector::capacity() 成正比?
如果两者的答案都是肯定的,我有什么选择?我的第一个解决方案是使用std::map<std::string, std::vector<cCustomClass> * > 和(或智能指针),但我想知道这是否有必要。
我使用 C++03。如果答案取决于标准,我很感激任何关于它的评论。
【问题讨论】:
-
将新元素插入地图(或集合)或删除元素不会使迭代器无效,表明内容不会被移动或复制。但没有绝对的保证。
-
不,
map不会随机复制元素。你能展示一些执行不必要复制的代码吗? -
你能说得更具体些吗? “相当大”有多大?你想用地图做什么?
-
我认为只有当你 insert() 一个已经填充到地图中的大向量时,才会出现性能问题,因为 move-insert 仅在 C++11 之后可用。所以当插入这么大的向量时,整个东西都会被复制到地图中。但这只会影响您插入的一个地图项,不会复制现有的地图项。
标签: c++ performance stl containers c++03