C++集合中的迭代器
Iterators in sets in C++
#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::rbegin
和 std::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()
。
相关文章:
- 集合上的输出迭代器:assign和increment迭代器
- C++集合的嵌套迭代器
- 基于函数而不是集合的二分搜索或迭代器?
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- 通过C 中的迭代器中的集合中的集合
- Qt:为模板(映射、列表、集合等)构建一个可变迭代器
- C 迭代器到集合的最后一个元素
- 为什么迭代器不返回集合的开头
- 是同一集合上的两个不同的迭代器
- 在C 中初始化集合迭代器
- 迭代器是否以相同的顺序迭代 boost::unordered_set 或 boost::unordered_map 只要集合不变?
- 集合迭代器处的多个标记
- 表达式:映射/集合迭代器不可递增
- 映射/集合迭代器不兼容-检查对象是否在映射中
- 映射/集合迭代器不兼容-检查映射中是否存在键
- 具有集合<string>和迭代器的函数
- 如何在 Map 中存储集合容器的迭代器列表
- 集合数据结构中的 end() 迭代器应该返回什么
- C++集合中的迭代器
- 充当过滤器的范围——不同的迭代器集合