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

时间:2016-12-23 13:34:10

标签: 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;
}

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

4 个答案:

答案 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()指向集合中的最后一个元素