最后一个元素的C++迭代器

Abd*_*iar 3 c++ iterator set

我在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();工作正常.

小智 37

只需使用*a.rbegin()which 指向集合中的最后一个元素


Pau*_*ans 6

为什么总是打印"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!

  • 可能还想说是UB (2认同)

小智 6

要找到集合的最后一个元素,我们可以做的是使用指向集合最后一个的迭代器,然后递减迭代器以到达最后一个元素,因为 set.end() 表示指向末尾之外的迭代器的集合。

auto it = s.end();
it--;
cout<<(*it)<<endl;

Run Code Online (Sandbox Code Playgroud)


Chr*_*ckl 5

*a.end()
Run Code Online (Sandbox Code Playgroud)

未定义的行为。在C ++迭代器术语中,“结束”与“最后一个元素”的含义不同。

更换cout << *a.end();cout << *--a.end();工作正常。

考虑一个反向迭代器:*a.rbegin()

请记住,这两个begin()rbegin()只返回dereferencable迭代器如果容器不为空。对于空容器,begin() == end()rbegin() == rend()