各位,今天调试一个程序时发现了一个奇怪的现象(尽量把代码写出来方便大家复制去自己机子上调试):
//首先我建立了一个int型的vector容器并初始化为: 1 1 2 2 3 3 4 4 5 5
vector<int> v_int;
for(vector<int>::size_type i=1;i<=5;++i)
{
v_int.push_back(i);
v_int.push_back(i);
}
//然后再将容器size扩展为15,并在末尾加入5个值为3的元素
v_int.resize(15,3);
//最后,问题来了:
vector<int>::iterator end_unique;
end_unique = unique(v_int.begin(),v_int.end());//筛选出无重复的序列
v_int.erase(end_unique,v_int.end());//擦除剩余重复元素
for(iter=v_int.begin();iter!=v_int.end();)//输出
{
cout <<*iter++<<" ";
}
输出的序列竟然不是期望的1 2 3 4 5,而是1 2 3 4 5 3!!
也就是说,unique函数没有把重复的那个元素3去除掉
本来正常情况下,如果调用unique后不erase剩下那些重复的元素,序列应该是这样的:
1 2 3 4 5 3 4 4 5 5 3 3 3 3 3 (无重复的序列为1 2 3 4 5)
而unique_end应该指向超出无重复元素范围的下一位置,也就是第六个元素3
但是如果你cout<<*unique_end会惊奇地发现居然是指向4!!
而且更神奇的是,如果在一开始初始化v_int时增多或减少一条v_int.push_back(i)语句,也就是把序列改为
1 2 3 4 5 3 3 3 3 3 或
1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 3 3 3 3 3
那么输出就没有任何问题了,都是1 2 3 4 5(后面不会奇怪地多出个3)
纠结了我一个早上啊TMD,百思不得其解
眼眸繁星
蛊毒传说
相关分类