C++集合中的迭代器

Iterators in sets in C++

本文关键字:迭代器 集合 C++      更新时间:2023-10-16
#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()时,我没有得到最大的元素。我需要帮助来了解正在发生的事情以及我应该怎么做才能输出集合中的最大数字

end迭代器实际上并不在容器内,而是"指向"容器末端之外的一个位置。取消引用容器外部的迭代器会导致未定义的行为


假装你有阵列

int a[] = { 1, 2, 3, 4 };
请记住,数组索引

是从零开始的,上述数组的有效索引将0 3(含)。数组的"开始"迭代器将&a[0],"结束"迭代器将&a[4]

或者从图形上看,它会是这样的:

+---+---+---+---+|1 |2 |3 |5 ]+---+---+---+---+^               ^|              |开始结束

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

    +---+---+---+---+    |1 |2 |3 |5 ]    +---+---+---+---+^               ^|              |Rend Rbegin

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

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

我应该怎么做才能输出集合中的最大数字

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

使用 std::set::rbegin .

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

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

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