我正在构建另一个应用程序将使用的DLL。我想在从函数调用返回之前将一些数据的当前状态全局存储在DLL的内存中,这样我就可以在下次调用函数时重用state。
为此,我需要保存一些迭代器。我正在使用std :: stack存储所有其他数据,但我不确定我是否也可以使用迭代器来完成。
将列表迭代器放在容器类中是否安全?如果没有,你能建议一种方法来存储指向列表中元素的指针,以便我以后可以使用它吗?
我知道使用向量来存储我的数据而不是列表会允许我存储下标并非常容易地重用它,但不幸的是我只需要使用std :: list。
答案 0 :(得分:6)
仅当列表被销毁或从列表中删除“尖头”元素时,列表的迭代器才会失效。
答案 1 :(得分:5)
是的,它会正常工作。
由于这是一个特殊质量的列表迭代器,所以还有很多其他的答案,我必须指出它适用于任何迭代器,包括矢量迭代器。如果向量被修改,向量迭代器失效的事实与将迭代器存储在另一个容器中是否合法的问题几乎无关 - 它是。当然,如果你做任何使它失效的事情,迭代器就会失效,但这与迭代器是否存储在堆栈(或任何其他数据结构)中无关。
答案 2 :(得分:4)
存储迭代器应该没有问题,只要确保不在列表的副本上使用它们 - 迭代器绑定到列表的一个实例,并且不能在副本上使用。 / p>
也就是说,如果你这样做:
std::list<int>::iterator it = myList.begin ();
std::list<int> c = myList;
c.insert (it, ...); // Error
正如其他人所说:当然,你也不应该通过删除指向元素来使迭代器失效。
答案 3 :(得分:2)
这可能是offtopic,但只是一个暗示......
请注意,您的函数/数据结构可能对读取操作不安全。有一种基本的线程安全性,其中读取操作不需要同步。如果你要存储状态调用者从你的结构中读取多少,它将使整个概念线程不安全并且使用起来有点不自然。因为没有人假定读取是状态完全操作。
如果两个线程要调用它,它们将需要同步调用,否则您的数据结构可能会在竞争条件下结束。这种设计中的问题是两个线程都必须能够访问公共同步变量。
我建议制作两个重载函数。两者都是无状态的,但是其中一个应该接受一个提示迭代器,从哪里开始下一个读/搜索/检索等。如何实现STL中的分配器。您可以向分配器传递提示指针(默认为0),以便更快地找到新的内存块。
的问候,
Ovanes
答案 4 :(得分:1)
存储列表的迭代器应该没问题。除非从已存储迭代器的列表中删除相同的元素,否则它不会失效。以下来自SGI网站的引用:
列表具有重要的属性 插入和拼接不 使迭代器无效以列出元素, 甚至删除只会失效 指向的迭代器 被删除的元素
但是,请注意存储的迭代器的上一个和下一个元素可能会更改。但迭代器本身仍然有效。
答案 5 :(得分:0)
同样的规则适用于存储在局部变量中的迭代器,就像在较长寿命的数据结构中一样:只要容器允许,它就会保持有效。
对于列表,这意味着:只要它指向的节点没有被删除,迭代器就会保持有效。显然,当列表被破坏时节点被删除...
答案 6 :(得分:-1)
是。列表是要走的路。你可以在这里引用我的回答类似的问题: What is the lifetime and validity of C++ iterators: