从向量列表中删除向量元素c ++

时间:2015-12-14 23:29:41

标签: c++ c++11

我一直在从这个论坛和其他人那里寻找解决这个问题的方法。我发现的唯一结果是迭代列表或访问向量列表中的元素。所以我想访问矢量的erase()函数。但我需要在矢量包含在列表容器中的情况下完成。我有一个示例代码,应该有助于解释。

#include<vector>
#include<list>
#include<iostream>

using namespace std;

int main()
{
    vector <int> a1 = { 1, 1, 1, 1, 1 };
    vector <int> a2 = { 2, 2, 2, 2, 2 };
    vector <int> a3 = { 3, 3, 3, 3, 3 };

    list<vector<int>> listVec;

    listVec.push_back(a1);
    listVec.push_back(a2);
    listVec.push_back(a3);

    for (auto p : listVec){

        for (auto p1 : p){
            cout << p1;
        }
        cout << "\n";
    }


}

那么擦除一个元素最简单的方法就是从矢量a2开始,因为它包含在列表中。现在我甚至没有错误的版本。 这段代码应该在遍历循环中的某个地方,但我无法编写它。

谢谢

2 个答案:

答案 0 :(得分:3)

好的,标准的方法:

auto iter = listVec.begin();
std::advance(iter, 1); // get second element
iter->erase(iter->begin() + n); // erase nth element of second element of list

在你的for循环中 - 你需要迭代对元素的引用 - 而不是元素的复制,否则你只从vector的副本中删除元素:

int pos = 0;
for (auto& p : listVec){
//       ^
   if (++pos == 1)
   {
       p.erase(p.begin() + n); // erase nth element of second element of list
   }
}

参考文献清单:

奖金回答:

对于您在评论中提到的问题 - 您有容器Document和文档迭代器 - 如Text_iterator - 最好遵循stl方案 - 因此将erase函数添加到您的Document并成为Text_iterator的这位班级朋友,请参阅:

class Text_iterator {   // keep track of line and character position within            a line
    list<Line>::iterator ln;
    Line::iterator pos;
    friend class Document; 

struct Document {
    list<Line> line;            //doucument is a list of lines
    void erase(Text_iterator iter)
    {
        iter.ln->erase(iter.pos);
    }

答案 1 :(得分:1)

迭代

for (auto p : listVec){

在迭代中对列表中的每个向量进行复制。因此,虽然您可以调用p.erase来删除该向量的元素,但这只会影响副本p,而不会影响列表中的向量。

如果您改为

for (auto &p : listVec){

p现在将成为列表中每个向量的引用。所以现在如果你调用p.erase,那将影响列表中的向量。