使用std :: set的.begin()和.end()函数会产生意外的结果

时间:2019-05-31 08:10:31

标签: c++ stl set

我有以下简单程序:

#include <iostream>
#include <set>
using namespace std;

int main()
{
    unsigned int qwer = 6132;
    unsigned int ty = 3512;
    unsigned int vv = 4331;
    unsigned int gg = 1337;
    set<unsigned int> asdf = {};
    asdf.insert(qwer);
    asdf.insert(ty);
    asdf.insert(vv);
    asdf.insert(gg);
    cout << "&asdf.begin() = " << &asdf.begin();
    unsigned int setint = *asdf.begin();
    cout << "\nsetint = " << setint;
    setint = *asdf.end();
    cout << "\nsetint = " << setint;
    cout << "\n&asdf.end() = " << &asdf.end();
    return 0;
}

它产生以下输出:

&asdf.begin() = 0x22fe08
setint = 1337
setint = 4
&asdf.end() = 0x22fe08

为什么asdf.begin()asdf.end()的地址匹配?我假设他们会有指向不同值的不同地址?尽管它们的地址确实匹配,但指向的值却不匹配!为什么会这样?

编辑:为什么为什么setint = asdf.end()似乎会将setint的值设置为集合中元素的数量而不是集合中的最后一个值? (我假设应该是6132对吗?)

1 个答案:

答案 0 :(得分:4)

您有很多不确定的行为。

&asdf.begin()
&asdf.end()

您要使用prvalue的地址。 &仅适用于左值和 qualified-id (带有名称的事物)

*asdf.end()

end迭代器不可取消。它指向“最后一个”位置。