为什么我不能删除向量中的元素?

时间:2012-10-28 14:26:28

标签: c++ vector erase

我有一个相当长的程序我正在处理并且很难从向量中删除元素。我试图用一个非常简单的向量来做,并且遇到了同样的问题。据我所知,我已经按照每个人在其他人的问题中解释过的方式完成了它。这是简单的代码。

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矢量中的最后一个元素。

3 个答案:

答案 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作为要添加的变量。

相关问题