[英]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
}
}
参考文献列表:
奖励答案:
对于您在注释问题中提到的问题-您在其中具有容器Document
和Document
迭代器-像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.