Я попытался реализовать ваш цикл while здесь. Ключевым моментом является то, что при удалении элемента из вектора, строки или deque итераторы, указывающие на этот элемент и далее (обратите внимание на это!), Становятся недействительными. Однако вы можете использовать возвращаемое значение функции-члена erase, которая является допустимым итератором, указывающим на элемент, следующий за стертым элементом.
Как указано в комментариях к вашему сообщению, это также можно реализоватьиспользуя std :: list. Тем не менее, std :: list может быть дорогим для перемещения вперед и назад в большом файле, так как он не поддерживает итераторы произвольного доступа. Кроме того, удаление элемента из std :: list имеет свои собственные проблемы аннулирования итерации (для этого обратитесь к пункту 9, Эффективный STL, Скотт Мейерс.)
while (getline(ifs, line))
{
if (line[0] == '.')
{
if(page.empty()) continue;
switch (line[1])
{
case '.':
line.erase(0,1);
linePointer = page.insert(linePointer, line);
++linePointer;
continue;
case '<':
linePointer = page.begin();
continue;
case '>':
linePointer = page.end();
continue;
case 'p':
--linePointer;
continue;
case 'n':
if(linePointer == page.end()) continue;
++linePointer;
continue;
case 'k':
--linePointer;
linePointer = page.erase(linePointer);
continue;
}
}
linePointer = page.insert(linePointer, line);
++linePointer;
}
Обратите внимание, что функциональность может быть не той, что выищите, потому что вы не предоставили более подробных примеров того, что вы ожидаете от данного ввода.