删除列表c中的最后3个元素

时间:2018-10-08 15:00:48

标签: c++ stl

我有这个c ++代码,可以很好地删除列表的最后3个元素,但是我想知道这是否是执行此操作的正确方法,因为我担心删除带有迭代器问题的元素。 该代码基本上采用6个元素“ Groups”的列表,将其分为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 :(得分:5)

即使多次使用返回的位置调用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,此代码将显示未定义的行为。

答案 1 :(得分:0)

  

还有更正确的方法吗?

不知道这意味着什么,但是假设您对学习std :: list感兴趣,我有一个公共成员函数 pop_back ,该函数删除了列表中的最后一个元素。使用此方法似乎很适合您的情况。

注意:如本refference

所述
  

如果容器不为空,则该函数永远不会引发异常   (无掷保证)。否则,它将导致未定义的行为。

因此,请确保在调用此函数时列表永远不会为空。

答案 2 :(得分:0)

我只是...

std::list <string> Groups;

...

for (int i = 0; i < 3; ++i)
    Groups.pop_back();