Вопрос по двунаправленному итератору [закрыт]

151
30 января 2020, 02:10
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «Stack Overflow на русском».

Закрыт 10 месяцев назад.

Вообщем выполняя лабораторную работу столкнулся с проблемой ввода и удаления структур из STL list , так как итераторы совершенно не хотят принимать инкрементацию или декрементацию(Expression : cannot increment end list iterator)...Не могу понять в чём причина , если итератор поставить в начало списка и ставлять элементы через Students.insert , проблем не возникает... Вот сам код:


#include <iostream>
#include <windows.h>
#include <string>
#include <list>
#include <iterator>
#undef max
using namespace std;
struct students 
{
    int  year;
    long long int telephon;
    wstring lastname;
    wstring name; 
};
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL, "Rus");
    int year, x;
    int n;
    unsigned int position;
    long long int telephon;
    wstring lastname;
    wstring name;
    list<students> Students;
    auto it = Students.begin();
    students *tmp = new students;
    do
    {
        wcout << L"1. Добавить элемент" << endl;
        wcout << L"2. Удалить элемент" << endl;
        wcout << L"3. Вывести список" << endl;
        wcout << L"0. Выйти" << endl;
        wcout << L"\nНомер операции > ";
        while (!(cin >> x) || (cin.peek() != '\n'))
        {
            cin.clear();
            while (cin.get() != '\n');
            wcout << L"Ошибка ввода,повторите ввод: ";
        }
        switch (x)
        {
        case 1:

            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            wcout << L"Имя > "; getline(wcin, name);
            wcout << L"Фамилия > "; getline(wcin, lastname);
            wcout << L"Год рождения > ";
            while (!(cin >> year) || (cin.peek() != '\n'))
            {
                cin.clear();
                while (cin.get() != '\n');
                wcout << L"Ошибка ввода,повторите ввод: ";
            }
            wcout << L"Телефон > ";
            while (!(cin >> telephon) || (cin.peek() != '\n'))
            {
                cin.clear();
                while (cin.get() != '\n');
                wcout << L"Ошибка ввода,повторите ввод: ";
            }
            wcout << L"Позиция > "; cin >> position;
            tmp->year = year;
            tmp->telephon = telephon;
            tmp->name = name;
            tmp->lastname = lastname;
            it++;
            Students.insert(it, *tmp); 
            break;
        case 2:
            break;
        case 3:  
            if (Students.empty()) { wcout << L"\nСписок пустой...\n\n"; }
            else for (it = Students.begin(); it != Students.end(); ++it) {
                wcout << L"\n{ " << it->name << L" ";
                wcout << it->lastname << L" ";
                wcout << it->year << L" ";
                wcout << it->telephon << L" }";
                cout << "\n\n";
            }
            break;
        }
    } while (x != 0);
}

P.S Хочу разобраться , подтолкните хотя бы в нужную сторону...

Answer 1

У вас изначально итератор it установлен на начало пустого списка. То есть он равен begin() и end() этого списка одновременно. Затем вы для него делаете it++. Разумеется, это некорректная операция. Нельзя инкрементировать итератор end().

Пока список пуст, не имеет значения, проинициализируете ли вы этот итератор значением begin() или end() - эти значения в пустом списке одинаковы.

Зачем вы вообще делаете это it++? Вам, как я понял, надо добавить элемент в конец списка. Тогда это просто

Students.insert(it, *tmp);  

при этом it остается равным end() и не инвалидируется. Но зачем вообще нужен этот it, если можно

Students.emplace_back(*tmp);  

???

И зачем *tmp размещается в динамической памяти?

READ ALSO
Компиляция в mingw64 в линукс для windows

Компиляция в mingw64 в линукс для windows

У меня ubuntu и я случайно узнал что в ubuntu есть пакет mingw64 ( а потом и о проекте в сети )Я установил их

140
Как показать html страницу?

Как показать html страницу?

Как на windows, qt 512

187
C++ и windows embedded handheld 6.5

C++ и windows embedded handheld 6.5

Работаю очень много с разными сканерами которые все работают на windows embedded handheld 65

164
Расстояние от точки до прямой С++

Расстояние от точки до прямой С++

у меня есть следующий код по нахождению расстояния между точкой и прямой:

165