C ++中集合中的迭代器

时间:2014-12-26 19:48:39

标签: c++ iterator set max

#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.begin()替换arr.end()时,我没有获得最大的元素。我需要帮助来理解发生了什么,以及如何输出集合中的最大数字

4 个答案:

答案 0 :(得分:2)

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


假装你有阵列

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

记住数组索引是从零开始的,上面数组的有效索引是03(包括)。数组的“begin”迭代器为&a[0],“end”迭代器为&a[4]

或图形上它会是这样的:

+---+---+---+---+
| 1 | 2 | 3 | 4 |
+---+---+---+---+
^               ^
|               |
begin           end

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

    +---+---+---+---+
    | 1 | 2 | 3 | 4 |
    +---+---+---+---+
^               ^
|               |
rend            rbegin

答案 1 :(得分:2)

  

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

那是因为end()“指向”一个元素超过集合的最后一个元素。

  

如何输出集合中的最大数字

你需要arr.rbegin(),它指向另一端的第一个元素,即指向最后一个元素。类型将从set<int>::iterator更改为set<int>::reverse_iterator。如果您使用C ++ 11,使用auto而不是显式类型将帮助您隐藏类型中的更改。

答案 2 :(得分:2)

使用std::set::rbegin

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

答案 3 :(得分:0)

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

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