Использование функций std :: set .begin () и .end () дает неожиданные результаты - PullRequest
0 голосов
/ 31 мая 2019

У меня есть следующая простая программа:

#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 Ответ

4 голосов
/ 31 мая 2019

У вас много неопределенного поведения.

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

Вы берете адрес prvalue. & может применяться только к lvalues ​​и qualid-id s (вещи с именами)

*asdf.end()

Итератор end не может быть разыменован. Указывает на позицию «один за другим».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...