C 迭代器到集合的最后一个元素

C++ iterator to last element of a set

本文关键字:最后一个 元素 集合 迭代器      更新时间:2023-10-16

我在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;
}

为什么它总是打印" 3",而不是集合中最伟大的元素?用cout << *--a.end();替换cout << *a.end();的工作正常。

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

*a.end()

未定义的行为。在C 迭代术语中," end"并不意味着与"最后一个元素"。

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

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

请记住,begin()rbegin()仅在容器不为空的情况下返回可返回的迭代器。对于空容器,begin() == end()rbegin() == rend()

为什么它总是打印" 3",而不是最大的元素 设置?

因为 a.end()一个过去 vector的末端。它没有任何有效的数据,它是向量末端的标记。如:

for(auto i = a.begin(); i != a.end(); ++i) 
    // do stuff with i

编辑:(感谢Nathan)删除a.end()产生可怕的未定义行为。一切都可能发生:获取3,获得集合中的最后一个元素,甚至可以取消X-MAS !!!

找到集合的最后一个元素,我们可以做的就是使用迭代器指向持续的效果,然后将迭代器降低以达到最后一个元素作为set.end.end。()表示指向集合末端的迭代器。

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

set<int>s

您也可以使用*prev(s.end())