擦除一个向量中的元素,并使用do-while将它们添加到另一个向量中

时间:2013-11-28 09:50:05

标签: c++ vector do-while

我正在尝试构建一个函数,它从向量顶部删除元素,并使用do-while循环(while bb.begin() != bb.end())将它们添加到另一个向量的底部。

我没想到它会在向量中只剩下一个元素的情况下工作,因为它是最后一个元素。但是我的代码工作,即使是最后一个元素,(bb = numberSearch.end()

这是怎么发生的?

vector<int> numberSearch;
vector<int> numberpool;

//set init values
for (int k =0; k<6; k++)
{
    numberSearch.push_back(k);
    numberpool.push_back(k * 10);
}

//add and remove
vector<int>::iterator bb = numberSearch.begin();
do
{
    cout << "current numberSearch= " << *bb << endl;
    numberpool.push_back(*bb);
    numberSearch.erase(bb);
} while (bb != numberSearch.end());

//output
vector<int>::iterator cc = numberpool.begin();
for(; cc !=numberpool.end(); cc++)
{
    cout<< "numberpool=" <<*cc <<endl;
}

//ouput
for(; bb !=numberSearch.end(); bb++)
{
    cout<< "numberpool=" <<*bb <<endl;
}

输出如下:

current numberSearch= 0  
current numberSearch= 1  
current numberSearch= 2  
current numberSearch= 3  
current numberSearch= 4  
current numberSearch= 5  
numberpool=0  
numberpool=10  
numberpool=20  
numberpool=30  
numberpool=40  
numberpool=50  
numberpool=0  
numberpool=1  
numberpool=2  
numberpool=3  
numberpool=4  
numberpool=5  

3 个答案:

答案 0 :(得分:2)

此解决方案实际上无效,因为您在删除它引用的元素后使用了迭代器。因此,代码表现出不确定的行为。修复此问题的方法是更改​​行:

numberSearch.erase(bb);

bb = numberSearch.erase(bb);

至于为什么这个(带修复)即使列表中只有一个元素也能正常工作:

end()将迭代器返回到向量的“一个结尾”。也就是说,它是向量的最后一个元素之后的迭代器。因此,即使在仅包含一个元素的向量中,它也不等于第一个元素。

答案 1 :(得分:0)

end()迭代器不指向最后一个元素。它是过去那个元素的迭代器。因此,所有元素都会被删除。

rbegin()是一个指向最后一个元素的迭代器。

另外,如上所述here

  

指向位置(或第一个)的迭代器,指针和引用   使用所有迭代器,指针和引用使得超出无效   位置(或第一)之前的元素保证继续引用   在电话会议之前他们指的是相同的元素。

因此,如建议的那样,你应该使bb等于擦除函数的返回值。

答案 2 :(得分:0)

理想情况下,您应该使用内置函数而不是do-while

numberpool.insert(numberpool.end(), numberSearch.begin(), numberSearch.end());
numberSearch.erase(numberSearch.begin(), numberSearch.end());