我在C ++中有以下代码
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> a;
int n;
for(int i=0;i<3;i++){
cin>>n;
a.insert(n);
}
cout << *a.end();
return 0;
}
为什么总是打印&#34; 3&#34;而不是集合中最大的元素?用cout << *a.end();
替换cout << *--a.end();
可以正常工作。
答案 0 :(得分:5)
为什么总是打印&#34; 3&#34;而不是最伟大的元素 设置?
因为a.end()
过了向量的结尾。它没有保存任何有效数据,它是矢量结束的标记。如:
for(auto i = a.begin(); i != a.end(); ++i)
// do stuff with i
编辑:(感谢Nathan)解除引用a.end()
会产生可怕的未定义行为。任何事情都可能发生:得到一个3
,得到集合中的最后一个元素,甚至可以取消X-mas!
答案 1 :(得分:2)
<p>{{data.title}}</p>
未定义的行为。在C ++迭代器术语中,&#34; end&#34;并不意味着&#34;最后一个元素&#34;。
用
*a.end()
替换cout << *a.end();
可以正常工作。
考虑一个反向迭代器:cout << *--a.end();
。
请记住,如果容器不为空,*a.rbegin()
和begin()
都只返回可解除引用的迭代器。对于空容器,rbegin()
和begin() == end()
。
答案 2 :(得分:2)
为了找到集合的最后一个元素,我们可以做的是使用一个指向集合最后一个元素的迭代器,然后递减迭代器以到达最后一个元素,因为 set.end() 代表指向的迭代器在集合结束之外。
auto it = s.end();
it--;
cout<<(*it)<<endl;
答案 3 :(得分:0)
只需使用*a.rbegin()
指向集合中的最后一个元素