#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()
时,我没有获得最大的元素。我需要帮助来理解发生了什么,以及如何输出集合中的最大数字
答案 0 :(得分:2)
end
迭代器实际上并不在容器内,而是“指向”超出容器末端的一个位置。取消引用容器外部的迭代器会导致undefined behavior。
假装你有阵列
int a[] = { 1, 2, 3, 4 };
记住数组索引是从零开始的,上面数组的有效索引是0
到3
(包括)。数组的“begin”迭代器为&a[0]
,“end”迭代器为&a[4]
。
或图形上它会是这样的:
+---+---+---+---+ | 1 | 2 | 3 | 4 | +---+---+---+---+ ^ ^ | | begin end
如果使用反向迭代器(std::set::rbegin
和std::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()
。