1

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

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

4

3 回答 3

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

于 2012-10-28T14:27:44.357 回答
2

你正在做的是未定义的行为。基本上,您正在访问向量的当前最后一个元素,并且您碰巧找到了留在此处的垃圾。at使用而不是[]访问元素使问题变得明显,因为at具有内置的范围检查。

// cout << vect[1] << endl;
cout << vect.at(1) << '\n';

如果您[]at上述方式替换,您将收到一个std::out_of_range异常,表明您提供的索引无效。

于 2012-10-28T14:29:39.257 回答
1

要删除向量中的最后一个元素,您可以使用.pop_back(). 您还应该注意,将整数添加到迭代器是一个坏主意。改为vector<int>::iterator用作要添加的变量。

于 2017-01-02T20:44:42.463 回答