#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> a = {1,2,3,7,1,5,4};
vector<int> b = {6,7,4,3,3,1,7};
a.erase(remove(a.begin(),a.end(),a[0]),a.end());
b.erase(remove(b.begin(),b.end(),b[0]),b.end());
return 1;
}
对于此特定示例,我的GNU gdb Ubuntu 7.7.1声明在返回1行:a = {2,3,7,1,5,4}这是不期望的(仅删除一个1),b = {7 ,4,3,3,1}。
我的期望是b应该是a = 2,3,7,5,4和b = 7,4,3,3,1,7。
这里发生了什么事?
的声明std::remove()
看起来像
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
请注意,最后一个参数是参考。因此,在编译之后,它有效地传递了指定元素的地址。
通过remove(a.begin(), a.end(), a[0])
,a
传入指示第0个元素的地址的东西。remove()
运行时,一旦处理了第0个元素,传入的引用所指向的值就会更改,从而导致意外结果。
为了获得预期的结果,请在致电之前进行复印std::remove()
。
int toberemoved = a[0];
a.erase(remove(a.begin(),a.end(),toberemoved),a.end());
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句