我有一个相当长的程序我正在处理并且很难从向量中删除元素。我试图用一个非常简单的向量来做,并且遇到了同样的问题。据我所知,我已经按照每个人在其他人的问题中解释过的方式完成了它。这是简单的代码。
vector<int> vect;
vect.push_back(3);
vect.push_back(2);
cout << vect[1]; // prints '2'
vect.erase(vect.begin()+1);
cout << vect[1] << endl; // prints '2'
我做错了什么?
上面的代码似乎有效,因为我检查了最后的大小,并打印出“1”。但真正的代码不是:
size = A[i]->B().size();
cout << "size is " << A[i]->B().size() << endl; // prints 21
A[i]->B().erase(A[i]->B().begin()+size);
cout << "size now " << A[i]->B().size() << endl; // prints 21
我看不出我的做法有何不同? A是矢量,存储其他矢量。我想删除B矢量中的最后一个元素。
答案 0 :(得分:5)
擦除元素后,向量的大小变为1(因为在擦除之前它是2),实质上使表达式vect[1]
导致未定义的行为,因为没有索引为1
的元素更多。剩下的都是单个元素(值= 3,索引= 0)。如果您使用vect.at(1)
代替vect[1]
,则会抛出std::out_of_range
。
编辑后:
请记住,如果大小为N
,则N
不是向量的有效索引!元素编入索引0, 1, 2, ... N-1
。实际上,大小为1
,因此唯一有效的索引是0
答案 1 :(得分:2)
您正在做的是未定义的行为。基本上,您正在访问向量的当前最后一个元素,并且您碰巧找到了留在这里的垃圾。使用at
代替[]
访问该元素可以明显解决问题,因为at
具有内置范围检查功能。
// cout << vect[1] << endl;
cout << vect.at(1) << '\n';
如果您按上述[]
替换at
,则会收到std::out_of_range
异常,表示您提供的索引无效。
答案 2 :(得分:1)
要删除向量中的最后一个元素,可以使用.pop_back()
。另外你应该注意到将一个整数添加到迭代器是个坏主意。请使用vector<int>::iterator
作为要添加的变量。