【问题标题】:Iterators in sets in C++C ++中的集合中的迭代器
【发布时间】:2014-12-26 19:48:38
【问题描述】:
#include<iostream>
#include<set>
using namespace std;

set <int> arr;

int main() {
int n, m, tmp;
cin>>n>>m;
for (int i=1; i<=m+n; i++) {
    cin>>tmp;
    if (tmp!=-1) arr.insert(tmp);
    else {
        set<int>::iterator it;
        it=arr.begin();
        cout<<*it<<endl;
        arr.erase(arr.begin());
    }
}
return 0;
}

所以这个程序实际上输出了集合中存在的最小元素。但是当我用arr.end() 替换arr.begin() 时,我没有得到最大的元素。我需要帮助来了解正在发生的事情以及我应该怎么做才能输出集合中的最大数字

【问题讨论】:

    标签: c++ iterator set max


    【解决方案1】:

    end 迭代器实际上并不在容器内部,而是“指向”容器末端 的一个位置。取消引用容器外部的迭代器会导致 undefined behavior


    假装你有数组

    int a[] = { 1, 2, 3, 4 };
    

    记住数组索引是从零开始的,上述数组的有效索引是03(含)。数组的“开始”迭代器是&amp;a[0],“结束”迭代器是&amp;a[4]

    或者在图形上是这样的:

    +---+---+---+---+ | 1 | 2 | 3 | 4 | +---+---+---+---+ ^ ^ | | 开始 结束

    如果使用反向迭代器(使用std::set::rbeginstd::set::rend),那么它将是这样的:

    +---+---+---+---+ | 1 | 2 | 3 | 4 | +---+---+---+---+ ^ ^ | | 重新开始

    【讨论】:

      【解决方案2】:

      但是当我用 arr.end() 替换 arr.begin() 时,我没有得到最大的元素。

      这是因为end()“指向”集合中最后一个元素之后的一个元素。

      如何输出集合中最大的数

      您需要arr.rbegin(),它指向另一端的第一个元素,即正确的最后一个元素。类型将从set&lt;int&gt;::iterator 更改为set&lt;int&gt;::reverse_iterator。如果您使用 C++11,使用 auto 代替显式类型将帮助您隐藏类型的更改。

      【讨论】:

        【解决方案3】:

        使用std::set::rbegin

                    set<int>::reverse_iterator it=arr.rbegin();
        

        【讨论】:

          【解决方案4】:

          取消引用 std::set::end() 会导致未定义的行为。

          如果您想要最大的元素,假设使用less&lt;int&gt; 进行标准排序,请使用rbegin()

          【讨论】:

            猜你喜欢
            • 2010-12-26
            • 2019-06-10
            • 2012-04-19
            • 2019-08-22
            • 2012-10-14
            • 2011-02-17
            • 1970-01-01
            • 1970-01-01
            • 2015-08-17
            相关资源
            最近更新 更多