Удалить последние 3 элемента в списке c ++ - PullRequest
0 голосов
/ 08 октября 2018

У меня есть этот код C ++, который прекрасно работает при удалении последних 3 элементов списка, но мне было интересно, если это правильный способ сделать это, так как я боюсь удаления элементов с проблемами итераторов.Код в основном берет список из 6 элементов «Группы», делит его на 2 меньших списка «Group1» и «Group2», а затем сравнивает другой список «GroupToCompare» с «Group2» и, если они равны, удаляет последний3 элемента «Группы».

#include "pch.h"
#include <iostream>
#include <iostream>
#include <string>
#include <list>
using namespace std;

int main()
{
    std::list <string> Groups = {};
    Groups = { "Spike", "Jet", "Faye", "Edward", "Vincent", "Elektra" };
    std::list<string> Group1 = {};
    std::list<string> Group2 = {};
    std::list<string> GroupToCompare = {};
    GroupToCompare = { "Edward", "Vincent", "Elektra" };

    size_t half1 = Groups.size() / 2;
    std::list<std::string>::iterator ig = Groups.begin();
    advance(ig, half1);
    Group1.insert(Group1.end(), Groups.begin(), ig);
    Group2.insert(Group2.end(), ig, Groups.end());

    std::list<std::string>::iterator removeIt = Groups.begin();
    advance(removeIt, half1);

    cout << "List Elements 1: " << endl;
    std::list<string>::iterator itrofList = Group1.begin();
    string firstvar;
    for (itrofList = Group1.begin(); itrofList != Group1.end(); ++itrofList) {
        firstvar = *itrofList;
        cout << "Item: " << firstvar << endl;
    }

    cout << "List Elements 2: " << endl;
    std::list<string>::iterator itrofList1 = Group2.begin();
    string firstvar1;
    for (itrofList1 = Group2.begin(); itrofList1 != Group2.end(); ++itrofList1) {
        firstvar1 = *itrofList1;

        cout << "Item: " << firstvar1 << endl;
    }

    if (Group2 == GroupToCompare) {
        removeIt = Groups.erase(removeIt);
        removeIt = Groups.erase(removeIt);
        removeIt = Groups.erase(removeIt);
    }

    cout << "List Elements of Groups after removing the last 3 elements: " << endl;
    std::list<string>::iterator itrofList2 = Groups.begin();
    string firstvar2;
    for (itrofList2 = Groups.begin(); itrofList2 != Groups.end(); ++itrofList2) {
        firstvar2 = *itrofList2;

        cout << "Item: " << firstvar2 << endl;
    }


}

Есть ли более правильный способ на случай, если я захочу удалить больше элементов в конце списка и избежать проблем с итераторами?Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Есть ли более правильный способ сделать это?

Не уверен, что это значит, но я предполагаю, что вы были бы заинтересованы в изучении std :: listимеет открытую функцию-член pop_back , которая удаляет последний элемент в списке.Использование этого кажется идеальным для вашего случая.

Примечание: Как указано в этом ссылке

Если контейнер не пустой, функция никогда не выдает исключений (нет-брось гарантию).В противном случае это вызывает неопределенное поведение.

Поэтому убедитесь, что список никогда не будет пустым при вызове этой функции.

0 голосов
/ 13 октября 2018

Я бы просто ...

std::list <string> Groups;

...

for (int i = 0; i < 3; ++i)
    Groups.pop_back();
0 голосов
/ 08 октября 2018

Даже если вызов std::list::erase() несколько раз с возвращенной позицией работает, вызов правильной перегрузки может помочь с удобочитаемостью и, возможно, производительностью:

iterator erase( iterator first, iterator last );

Пример:

std::list<int> l{1, 2, 3, 4, 5};
l.erase(std::prev(l.end(), 3), l.end());
// l is {1, 2}

Осторожно: как есть, этот код демонстрирует неопределенное поведение, если l имеет размер не менее 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...