繁体   English   中英

从向量列表中擦除向量元素C ++

[英]Erase a vector element from list of vectors c++

我一直在这个论坛和其他组织中寻找解决此问题的方法。 我发现的唯一结果是遍历列表或访问向量列表中的元素。 所以我想访问向量的delete()函数。 但是我需要在列表容器中包含vector的情况下完成此操作。 我有一个示例代码,应该可以帮助解释。

#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中删除一个元素将是最简单的方法,因为它包含在列表中。 现在,我什至没有错误的版本。 这段代码应该在遍历循环中的某个位置,但是我无法编写。

谢谢

好的,标准方法是:

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
   }
}

参考文献列表:


奖励答案:

对于您在注释问题中提到的问题-您在其中具有容器DocumentDocument迭代器-像Text_iterator一样-最好是遵循stl方案-因此向您的Document添加erase功能并使该类成为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);
    }

迭代

for (auto p : listVec){

遍历列表时复制列表中的每个向量。 因此,尽管您可以调用p.erase擦除该向量的元素,但这只会影响副本p而不会影响列表中的向量。

如果您改为

for (auto &p : listVec){

p现在将成为列表中每个向量的引用 因此,现在如果调用p.erase ,将会影响列表中的向量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM