Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «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 Хочу разобраться , подтолкните хотя бы в нужную сторону...
У вас изначально итератор it
установлен на начало пустого списка. То есть он равен begin()
и end()
этого списка одновременно. Затем вы для него делаете it++
. Разумеется, это некорректная операция. Нельзя инкрементировать итератор end()
.
Пока список пуст, не имеет значения, проинициализируете ли вы этот итератор значением begin()
или end()
- эти значения в пустом списке одинаковы.
Зачем вы вообще делаете это it++
? Вам, как я понял, надо добавить элемент в конец списка. Тогда это просто
Students.insert(it, *tmp);
при этом it
остается равным end()
и не инвалидируется. Но зачем вообще нужен этот it
, если можно
Students.emplace_back(*tmp);
???
И зачем *tmp
размещается в динамической памяти?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня ubuntu и я случайно узнал что в ubuntu есть пакет mingw64 ( а потом и о проекте в сети )Я установил их
Работаю очень много с разными сканерами которые все работают на windows embedded handheld 65
у меня есть следующий код по нахождению расстояния между точкой и прямой: