我有两个关于迭代器的问题。
发布于 2013-12-24 20:50:31
不同容器的迭代器具有不同的属性。Here are the iterator invalidation rules。
当您将列表循环推到上时,列表循环:所有以前的迭代器都仍然有效。显然,如果每次迭代器转发一个迭代器时还添加了一个新元素,那么您就永远不会到达终点。
向量循环:对于向量,一旦push_back导致新的大小超过旧容量,迭代器就无效。一旦发生这种情况,使用iter就是未定义的行为(您可能会崩溃)。
我认为当向量容器必须调整大小时,它会以2的幂进行调整,并且位于一个新的内存区域。
这是标准没有规定的。C++标准库的一些实现在容量超过旧容量时是向量容量的两倍,而其他实现则以不同的速率增长。
发布于 2013-12-24 20:50:18
你第一个问题的答案载于你的第二个问题。
至于第二个问题,则是实现定义了向量如何分配内存。没有必要在每次耗尽内存时将内存的大小翻一番。
发布于 2013-12-24 20:53:43
对于迭代器的有效性,不同的容器通常有不同的保证,以及对元素的指针/引用:
std::list<T>,对元素的迭代器和指针/引用仍然有效,直到相应的节点被擦除或std::list<T>存在为止。std::vector<T>来说,有效性更复杂:std::vector<T>需要调整其内部缓冲区的大小时,即当插入超出容量时,所有迭代器都失效。当超过容量和分配多少内存取决于实现(唯一的要求是容量成倍增长,2是一个合理的选择,但还有许多其他的选择)。std::vector<T>中时,插入点之前的所有迭代器都保持有效,除非重新分配是必要的。std::vector<T>中擦除时,所有经过擦除点的迭代器都失效。
其他容器具有不同的有效性约束(例如,std::deque<T>使迭代器无效,但可以使指针/引用有效)。
https://stackoverflow.com/questions/20766521
复制相似问题