【问题标题】:Using a Set Iterator in C++在 C++ 中使用集合迭代器
【发布时间】:2010-12-26 14:30:54
【问题描述】:

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

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

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

【问题讨论】:

  • DoSomething 声明为什么?
  • 这个例子看起来似乎是正确的(除非缺少;)。您需要发布更完整的内容,以实际展示您遇到的问题。例如,mySet 是如何填充的?
  • 是编译时错误还是运行时错误?
  • 虽然在这种情况下可能没有什么不同,但您可能会获得更好的性能:++myIterator。后缀运算符需要制作迭代器的副本。
  • 不是显示代码“看起来像”,而是向我们展示代码实际上是什么。此外,最好在迭代器上使用预增量而不是后增量,因为后增量需要创建一个无意义的临时变量。

标签: c++ iterator set dereference


【解决方案1】:

如果DoSomething() 改变了集合——移除或插入项目,那么你持有的迭代器就会失效,这可能会导致这个错误。

【讨论】:

  • 只有一点点正确:std::set 迭代器只有在它所引用的项目从集合中删除时才会失效:您可以插入任何项目,也可以删除除一个以外的任何项目。见 23.1.2/8。
【解决方案2】:

您做错的第一件事也是最大的错误就是编写这样的代码。您上面的内容是手动编写的:

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

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

【讨论】:

  • 如果您决心避免编写循环,您可以使用unary_compose,以及将一对映射到其第一个或第二个元素的函数。
【解决方案3】:

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

【讨论】:

  • 鉴于循环的条件,我不太确定这里的情况如何。不过,我可能错了:如果我错了,有人可以给我一个小例子或解释吗?谢谢。
  • 白金:问题中的实际代码不是他在运行什么,这只是他的印象(“看起来像”)。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2012-10-14
    • 2012-04-19
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    相关资源
    最近更新 更多