3

当我尝试在 C++ 的调试模式下使用集合迭代器时,我收到一条错误消息,提示“map/set iterator not dereferencable”。我不明白,因为我认为取消引用是你应该如何使用迭代器。代码如下所示:

set<int>::iterator myIterator;
for(myIterator = mySet.begin();
    myIterator != mySet.end();
    myIterator++)
    DoSomething(*myIterator)

这是我在网上看到的关于如何使用迭代器的所有示例的格式。我究竟做错了什么?

4

4 回答 4

7

如果DoSomething()更改集合 - 删除或插入项目,则您持有的迭代器无效,这可能会导致此错误。

于 2009-12-14T22:10:41.203 回答
2

您做错的第一件事也是最大的错误就是编写这样的代码。您上面所拥有的是手动编写的等价物:

std::for_each(mySet.begin(), mySet.end(), DoSomething);

除了实现算法之外,迭代器的真正好的用途相对较少。偶尔使用 map 或 multimap(或 unordered_[multi]map)是合理的,但这主要是使用 std::pair 来补偿 map 和 multimap,这并不完全好。

于 2009-12-14T22:44:28.910 回答
1

该错误通常意味着您正在访问“end()”迭代器。

于 2009-12-14T22:10:43.903 回答
1

这个问题是基于一个错误的前提。我看到错误“map/set iterator not dereferencable”,并认为这是适用于所有 map/set 迭代器的一般性声明,就像我说的那样没有任何意义。但我又看了一遍,真正的问题是我用来访问那个迭代器的指针是无效的。

于 2009-12-14T22:44:06.943 回答