我一直在从这个论坛和其他人那里寻找解决这个问题的方法。我发现的唯一结果是迭代列表或访问向量列表中的元素。所以我想访问矢量的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开始,因为它包含在列表中。现在我甚至没有错误的版本。 这段代码应该在遍历循环中的某个地方,但我无法编写它。
谢谢
答案 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
,那将影响列表中的向量。