我有一个相当长的程序,我正在努力,并且很难从向量中删除元素.我试图用一个非常简单的向量来做,并且遇到了同样的问题.据我所知,我的做法与每个人在其他人的问题中解释的方式相同.这是简单的代码.
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'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
看起来上面的代码是有效的,因为我检查了最后的大小,并打印出"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
Run Code Online (Sandbox Code Playgroud)
我看不出我做了什么不同的事情?A是矢量,存储其他矢量.我想删除B向量中的最后一个元素.
擦除元素后,向量的大小变为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