在我的方案中,我有std::map<std::string, std::vector<cCustomClass> >
,但同样的问题适用于std::set
。这些向量可能会变得非常大(超过100000个元素),所以如果向地图添加更多元素,我会担心是否重新分配或复制向量。
核心问题是:地图会在某个时刻复制大型向量,如果是,它的成本是否与std::vector::capacity()
成比例?
如果两者的答案都是肯定的,那么我的选择是什么?我的第一个解决方案是使用std::map<std::string, std::vector<cCustomClass> * >
和(或智能指针),但我想知道这是否有必要。
我使用C ++ 03。如果答案取决于标准,我感谢任何关于它的评论。
答案 0 :(得分:3)
地图是否会在某个时刻复制大型矢量
没有。 map
,set
和其他关联容器是基于节点的。节点是为每个条目独立分配的,通过指针连接,并且在容器增长,收缩,重新平衡等等时不需要复制或重新分配。
您对此的保证是各种容器上的迭代器失效要求。比较
没有迭代器或引用无效
如果迭代器无效,它们指向的元素必须将其位置保留在内存中,因此插入地图不需要复制或移动任何现有元素。
如果新
size()
大于capacity()
,则所有迭代器和引用都将失效。否则,只有插入点之前的迭代器和引用仍然有效。过去的迭代器也无效。
如果迭代器 无效,则元素可能移动,复制或移动值。特别是对于向量,插入之后的元素必须被移动/复制,以便为新元素腾出空间。
如果向量需要重新分配以增长,则必须将所有元素移动/复制到新分配的区域。
值得注意的是,尽管map
并没有真正影响到您,但现代编译器会尽可能移动元素。例如,你的大向量将被移动,这比复制它要便宜得多 - 如果你可以更新到C ++ 11或更高版本,那就是。