【问题标题】:Error on `it-1` with set iterator使用集合迭代器在“it-1”上出错
【发布时间】:2015-09-26 22:02:53
【问题描述】:

在以下代码中,我无法识别 --itit-1 之间的区别。 还有words.end() 的值是否超出设置范围?

#include <iostream>
#include<set>

using namespace std;

int main()
{
    set<string> words;
    words.insert("test");
    words.insert("crack");
    words.insert("zluffy");
    set<string>::iterator it=words.end();
    cout<<*(--it)<<endl;//just works fine 
    cout<<*(it-1)<<endl;//Error 
    return 0;
}

【问题讨论】:

    标签: c++ iterator set


    【解决方案1】:

    这是因为std::set::iterator 是一个常量BidrectionalIterator。这意味着它支持++it--it。然而,它不是RandomAccessIterator(如std::vector::iterator)——这是支持it + nit - n所需要的。

    虽然--itit -= 1 在概念上做同样的事情,但后者需要比std::set 提供的更多功能。这就是它不被支持的原因。您总是可以使用类似:std::prev(it, 1),它适用于任何满足 BidirectionalIterator 概念的迭代器。

    【讨论】:

      【解决方案2】:

      words.end() 为超出集合末尾的“元素”提供迭代器。它不指向任何东西,所以你不能取消引用它。 它为您的套装服务。例如,您可以将您的集合从words.end() 扫描到words.begin()

      for (set<string>::iterator it = words.begin() ; it != words.end() ; ++it)
      {
          cout << *it << endl;
      }
      

      【讨论】:

      • 谢谢你的回答,我明白了。
      猜你喜欢
      • 2014-12-27
      • 2010-12-26
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多