Зачем использовать iter = lst.вставка(iter, word), а не просто lst.вставка(iter, word)

#c

Вопрос:

Я все еще изучаю insert() C .

Зачем использовать iter = здесь?

 list<string> lst;
auto iter = lst.begin();
while (cin >> word)
    iter = lst.insert(iter, word);
 

Почему не так, как сейчас?

 list<string> lst;
auto iter = lst.begin();
while (cin >> word)
    lst.insert(iter, word);
 

Я в замешательстве, потому что есть также этот случай, который не использует slist.begin() = :

 list<string> slist;
slist.insert(slist.begin(), "Hello!");
 

Комментарии:

1. пожалуйста, опубликуйте правильный код, а не код с ненужными синтаксическими ошибками. 1st не является допустимым именем

2. Возможно, вы ищете что-то вроде std::back_inserter того, что можно использовать вместе с перегрузкой итератора std::list конструктора ?

3. @463035818_is_not_a_номер, Но в книге это используется в качестве названия… что также сбивает меня с толку

4. Это, вероятно lst , вместо 1st того, чтобы, если только в книге не было ошибки.

5.Пожалуйста, прочтите о том, что std::list::insert возвращает функция .


Ответ №1:

Разница становится сразу очевидной, когда вы смотрите на вывод следующего ввода:

 1
2
3
 

A:

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

int main()
{
    std::list<std::string> st;
    auto iter = st.end();
    std::string word;
    while (cin >> word)
        iter = st.insert(iter, word);

    for (const autoamp; w : st) std::cout << w << " ";
}
 

выход:

 3 2 1
 

B:

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

int main()
{
    std::list<std::string> st;
    auto iter = st.end();
    std::string word;
    while (cin >> word)
        st.insert(iter, word);

    for (const autoamp; w : st) std::cout << w << " ";
}
 

выход:

 1 2 3 
 

Обратите внимание , что я использовал end() вместо begin() , потому begin() что выглядит немного подозрительно, когда в списке еще нет элемента. Однако для пустого списка, begin() == end() , поэтому это не меняет результат.

std::list::insert() вставляет элемент перед элементом, на который ссылается переданный вами итератор, а затем возвращает итератор для вновь вставленного элемента. Следовательно, A вставляет следующий элемент всегда перед последним вставленным элементом. С другой стороны, B всегда вставляет следующий элемент в конец списка, потому iter что всегда указывает на список end .