我在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;
}
Run Code Online (Sandbox Code Playgroud)
为什么总是打印"3"而不是集合中最大的元素?更换cout << *a.end();用cout << *--a.end();工作正常.
为什么总是打印"3"而不是集合中最大的元素?
由于a.end()是一个过去的矢量结束.它不包含任何有效数据,它是矢量结束的标记.如:
for(auto i = a.begin(); i != a.end(); ++i)
// do stuff with i
Run Code Online (Sandbox Code Playgroud)
编辑:(感谢Nathan)解除引用会a.end()产生可怕的未定义行为.任何事情都可能发生:得到一个3,获得集合中的最后一个元素,甚至可以取消X-mas!
小智 6
要找到集合的最后一个元素,我们可以做的是使用指向集合最后一个的迭代器,然后递减迭代器以到达最后一个元素,因为 set.end() 表示指向末尾之外的迭代器的集合。
auto it = s.end();
it--;
cout<<(*it)<<endl;
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)*a.end()
未定义的行为。在C ++迭代器术语中,“结束”与“最后一个元素”的含义不同。
更换
cout << *a.end();用cout << *--a.end();工作正常。
考虑一个反向迭代器:*a.rbegin()。
请记住,这两个begin()并rbegin()只返回dereferencable迭代器如果容器不为空。对于空容器,begin() == end()和rbegin() == rend()。
| 归档时间: |
|
| 查看次数: |
6595 次 |
| 最近记录: |