Итератор begin() должен содержать 3, вывод говорит 2?

Почему итератор, указывающий на начало списка, выводит второе значение? Почему a.begin()++ покидает begin () впереди и есть ли лучшая реализация?

#include <iostream>
#include <list>
using namespace std;
//3,2,1
int main() {
    list<int> a;
    a.insert(a.begin(),1);              
    cout << *(a.begin()) << endl;
    a.insert(a.begin(),3);
    cout << *a.begin()<< endl;
    a.insert(a.begin()++,2);
    list<int>::iterator iterator = a.begin();
    iterator++;
    cout << *iterator << endl;
        return 0;
}

Мой вывод:

1
3
3

Ожидаемый результат:

1
3
2

Редактировать: "Поскольку вы ставите 2 в начале списка. Помните, что a.begin()++ выполняет постинкрементное увеличение, т. Е. Увеличивается после всех других операций. Попробуйте свой код с помощью ++a.begin() и посмотрите если он делает то, что вы ожидаете "- @Ben

Типографская ошибка, спасибо Бен.

2 ответа

Решение

Похоже, это было просто забыть, что a.insert(a.begin()++,2); эквивалентно a.insert(a.begin(), 2) в этом случае. Это потому, что постинкремент добавит 2 в начало списка, затем увеличьте итератор. Если вы хотите получить ожидаемый результат, вам нужно использовать оператор предварительного увеличения. то есть:

a.insert(++a.begin(), 2)

Код в порядке:

#include <iostream>
#include <list>
using namespace std;
//3,2,1
int main() {
    list<int> a;
    a.insert(a.begin(),1);
    cout << *(a.begin()) << endl;
    a.insert(a.begin(),3);
    cout << *a.begin()<< endl;
    a.insert(a.begin()++,2);
    list<int>::iterator iterator = a.begin();
    cout << *iterator << endl;
    return 0;
}

Выход:

1
3
2

Проверьте в Ideone тоже.

Другие вопросы по тегам