C++ 删除一个向量中的元素,然后使用do while将其添加到另一个向量中

C++ 删除一个向量中的元素,然后使用do while将其添加到另一个向量中,c++,vector,do-while,C++,Vector,Do While,我正在尝试构建一个函数,该函数使用do-while循环(while bb.begin()!=bb.end())擦除向量顶部的元素并将它们添加到另一个向量底部 我没想到它会在向量中只剩下一个元素的情况下工作,因为它是最后一个元素。但是我的代码可以工作,即使是最后一个元素,而(bb=numberSearch.end() 这是怎么发生的 vector<int> numberSearch; vector<int> numberpool; //set init values fo

我正在尝试构建一个函数,该函数使用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;
}
end()
迭代器不指向最后一个元素。它是经过该元素的迭代器。因此,所有元素都会被删除

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

另外,如前所述,

指向位置(或第一个)的迭代器、指针和引用,以及 beyond是无效的,所有迭代器、指针和对 位置(或第一个)之前的元素保证继续引用 他们在通话前提到的相同元素


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

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

numberSearch.erase(bb);
进入

至于为什么即使列表中只有一个元素,此选项(使用修复)仍然有效:


end()
返回一个迭代器,该迭代器指向向量的“结束后的一个”。也就是说,它是指向向量最后一个元素之后的迭代器。因此,即使在只包含一个元素的向量中,它也与第一个元素相等。

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

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

虽然这是一个很好的提示,但它并没有解决所问的问题,因此作为一个评论比作为一个答案更好。这个内置功能肯定更有意义
bb = numberSearch.erase(bb);
numberpool.insert(numberpool.end(), numberSearch.begin(), numberSearch.end());
numberSearch.erase(numberSearch.begin(), numberSearch.end());