C++ iterator to last element of a set

2019-06-02 10:38发布

I have the following code in 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;
}

Why is it always printing "3" instead of the greatest element in the set? Replacing cout << *a.end(); with cout << *--a.end(); works fine.

标签: c++ iterator set
3条回答
爷的心禁止访问
2楼-- · 2019-06-02 11:08

Why is it always printing "3" instead of the greatest element in the set?

Because a.end() is one past the end of your vector. It doesn't hold any valid data, it's a marker for the end of your vector. As in:

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

EDIT: (thanks to Nathan) dereferencing a.end() yields the dreaded undefined behaviour. Anything could have happened: get a 3, get the last element in the set, could even have canceled X-mas!!!

查看更多
我欲成王,谁敢阻挡
3楼-- · 2019-06-02 11:15
*a.end()

Undefined behaviour. In C++ iterator terminology, "end" does not mean the same thing as "last element".

Replacing cout << *a.end(); with cout << *--a.end(); works fine.

Consider a reverse iterator: *a.rbegin().

Keep in mind that both begin() and rbegin() only return dereferencable iterators if the container is not empty. For empty containers, begin() == end() and rbegin() == rend().

查看更多
虎瘦雄心在
4楼-- · 2019-06-02 11:28

Just use *a.rbegin() which points to the last element in the set

查看更多
登录 后发表回答