获取指向 std::list 或 std::forward_list 中节点的指针

Ahm*_*d A 3 c++ pointers stl

我计划在我的代码中使用 std::list ,我决定不使用 std::forward_list ,因为对于删除(我认为),必须遍历整个列表, std::forward_list 的复杂度为 O(N) (正在单个链接列表)。然而,当我查看文档时,我注意到两个 stl 容器都具有 O(N) 复杂度来删除项目。

经过一番思考,我明白了原因(我认为)。这是因为在这两种情况下,都必须扫描整个列表以首先找到节点,然后删除它。这是正确的吗?

然后我研究了“erase”和“erase_after”方法,它们的复杂性是“与擦除(破坏)的元素数量成线性关系”。这是因为,我将迭代器传递给节点(有点像“指针”)。但是,我不能(或不愿意)在代码中传递此迭代器来访问节点中的数据。我不确定如果列表被修改,这个迭代器是否有效?想法?

我的问题是,有没有办法获得指向列表中节点的指针。这样,我知道它将在我的程序的整个生命周期内有效,并将其传递。我只需查看它即可访问我的数据。

Aar*_*aid 5

但是,我不能(或不愿意)在代码中传递此迭代器来访问节点中的数据。

为什么不?迭代器易于使用并且非常轻量。无论如何,指针都不是更好。

我不确定如果列表被修改,这个迭代器是否有效?

对于list,任何迭代器都将保持有效,即使列表被修改。除了,如果您删除了迭代器指向的特定元素,则除外。但这是显而易见的,您可以期望有一个迭代器(或指针)指向不再存在的东西。

vector更危险。对向量的一个小更改可能会使它的所有迭代器失效。)

您可以使用指向 中任何单个元素的指针list

list<int> iterator it = find(l.begin(), l.end(), 7); // get an iterator
int * ptr = &*it; // get a pointer to the same element.
Run Code Online (Sandbox Code Playgroud)

指针在很多方面与迭代器相似。但迭代器的功能更强大一些。迭代器可以递增或递减,以访问列表中的相邻元素。迭代器可用于从列表中删除元素。指针不能做这两件事。

只要该特定元素未被删除,迭代器和指针就保持有效。