【问题标题】:how to iteratively print the elements in a SET (STL)如何迭代地打印 SET (STL) 中的元素
【发布时间】:2014-08-03 07:16:31
【问题描述】:

这是我的代码。它是正确的。

set<float> set1;
set1.insert(1);
set1.insert(2);
set1.insert(3);

set<float>::iterator it1;
for (it1 = set1.begin(); it1 != set1.end(); it1 ++)
{
    cout << *it1 <<" ";
}

但是为什么下面的代码不起作用?

    set<float> set1;
    set1.insert(1);
    set1.insert(2);
    set1.insert(3);

    set<float>::iterator it1;
    for (it1 = set1.begin(); it1 != set1.end()-1; it1 ++)
    {
        cout << *it1 <<" ";
    }

【问题讨论】:

    标签: c++ stl set


    【解决方案1】:

    std::set 的迭代器是bidirectional。这意味着它们支持任一方向的单步(it++it-- 等),但不支持任意长度的增量(it + N 等)。

    考虑到std::set 通常实现为自平衡二叉搜索树,这可能是因为这将是一个低效的 O(N) 操作。

    您可以使用std::advancestd::nextstd::prev 以任意数量递增/递减双向迭代器:

    std::advance(it, 42);
    it = std::next(it, 42);
    it = std::prev(it, 42);
    

    【讨论】:

    • vector::iterator 怎么样?我以为是一样的。在for 中,`it1++' 也可以。但是代码证明我错了。
    • @tqjustc 那是一个随机访问迭代器
    • @tqjustc 不,那些是随机访问的
    【解决方案2】:

    operator-operator+ 不支持非随机访问类型但为双向类型的集合迭代器。

    参考:Here

    【讨论】:

      【解决方案3】:

      set&lt;&gt;::begin() 返回的迭代器类型没有指定operator+(int)。但是,在您的示例中,您可以改用 operator--()

      for (it1 = set1.begin(); it1 != --set1.end(); ++it1)
      {
          cout << *it1 << " ";
      }
      

      【讨论】:

      • 此代码有效。但只能标记一个最佳答案。所以我只给你一个赞成票。
      猜你喜欢
      • 2016-10-11
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 2013-12-02
      • 1970-01-01
      • 2011-02-21
      相关资源
      最近更新 更多