C++ 在容器中存储迭代器

C++ 在容器中存储迭代器,c++,stl,iterator,C++,Stl,Iterator,我正在构建另一个应用程序将使用的DLL。我希望在从函数调用返回之前,将某些数据的当前状态全局存储在DLL的内存中,以便在下次调用函数时重用状态 为此,我必须保存一些迭代器。我使用std::stack来存储所有其他数据,但我不确定是否也可以使用迭代器来存储这些数据 在容器类中放置列表迭代器安全吗?如果没有,您能否建议一种方法,将指向元素的指针存储在列表中,以便我以后使用它 我知道使用向量而不是列表来存储数据会使我能够非常轻松地存储下标并重用它,但不幸的是,我只能使用std::list。存储迭代器应

我正在构建另一个应用程序将使用的DLL。我希望在从函数调用返回之前,将某些数据的当前状态全局存储在DLL的内存中,以便在下次调用函数时重用状态

为此,我必须保存一些迭代器。我使用std::stack来存储所有其他数据,但我不确定是否也可以使用迭代器来存储这些数据

在容器类中放置列表迭代器安全吗?如果没有,您能否建议一种方法,将指向元素的指针存储在列表中,以便我以后使用它


我知道使用向量而不是列表来存储数据会使我能够非常轻松地存储下标并重用它,但不幸的是,我只能使用std::list。

存储迭代器应该没有问题,只要确保不要在列表的副本上使用迭代器——迭代器绑定到列表的一个实例,并且不能在副本上使用

也就是说,如果您这样做:

std::list<int>::iterator it = myList.begin ();
std::list<int> c = myList;

c.insert (it, ...); // Error
std::list::iterator it=myList.begin();
std::list c=myList;
c、 插入(它,…);//错误

正如其他人所指出的:当然,您也不应该通过删除指向元素来使迭代器无效。

同样的规则适用于存储在局部变量中的迭代器,就像在长寿命的数据结构中一样:只要容器允许,它将保持有效


对于列表,这意味着:只要它指向的节点没有被删除,迭代器就保持有效。显然,当列表被销毁时,节点会被删除。

只有当列表被销毁或“pointed”元素从列表中删除时,列表的迭代器才会失效。

存储列表的迭代器应该可以。除非从存储迭代器的列表中删除相同的元素,否则它不会失效。以下引用自网站:

列表具有以下重要特性: 插入和拼接不起作用 使迭代器失效以列出元素, 即使是移除也只会失效 指向 删除的元素

但是,请注意,存储的迭代器的上一个和下一个元素可能会更改。但是迭代器本身仍然有效。

是的,它可以正常工作


因为有很多其他的答案都说这是列表迭代器的一种特殊性质,所以我必须指出,它适用于任何迭代器,包括向量迭代器。如果向量被修改,向量迭代器就会失效,这一事实与将迭代器存储在另一个容器中是否合法的问题几乎没有关系——事实确实如此。当然,如果您执行任何使迭代器失效的操作,迭代器可能会失效,但这与迭代器是否存储在堆栈(或任何其他数据结构)中无关。

这可能与主题无关,但只是一个提示

请注意,对于读取操作,您的函数/数据结构可能是线程不安全的。有一种基本的线程安全性,读取操作不需要同步。如果您要存储调用程序从您的结构中读取的数据量,则会使整个概念线程不安全,使用起来有点不自然。因为没有人认为读操作是状态完全操作

如果两个线程要调用它,它们要么需要同步调用,要么您的数据结构可能最终处于竞争状态。这种设计中的问题是两个线程都必须能够访问公共同步变量

我建议创建两个重载函数。两者都是无状态的,但其中一个应该接受提示迭代器,从何处开始下一次读取/搜索/检索等。这就是STL中分配器的实现方式。您可以向分配器传递一个提示指针(默认为0),以便它更快地找到新的内存块

问候,

Ovanes

他没有说任何关于修改列表的事情,所以我一开始就看不出失效是一个什么问题。谢谢你的提示,Ovanes。但在我的例子中,问题不会出现,因为每个线程的状态存储在单独的位置。一次只有一个线程从容器中读取数据。我不确定我是否完全理解重载函数,我将不得不阅读有关分配器的内容,但也感谢您的建议。听起来很有趣只是一个疑问,如果我将迭代器存储在变量中列表的开头,然后在第一个元素之前插入一个元素,那么如果我遵从我以前的迭代器,它会给我其中的值还是会失效?