c++ - 使用 do-while 从一个 vector 中删除元素并将它们添加到另一个 vector

标签 c++ vector do-while

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

我没想到它会在 vector 中只剩下一个元素的情况下工作,因为它是最后一个元素。但是我的代码有效,即使是最后一个元素,而 (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  

最佳答案

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

numberSearch.erase(bb);

进入

bb = numberSearch.erase(bb);

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

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

关于c++ - 使用 do-while 从一个 vector 中删除元素并将它们添加到另一个 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20262698/

相关文章:

java do while loop 在满足条件后一直循环

c++ - 如何访问 const volatile std::array?

c++ - 将数据推回二维 vector

java - 如何填充和访问 3 维数组列表的任何元素

c++ - std::vector capacity/size/reserve 可以用于手动管理 vector 内存分配吗?

java - 重复扫描仪临时创可贴? ( java )

swift - 无法在 swift ("if"或可能 "while"中创建正确的函数)

c++ - 具有直接像素访问的 Opencv 颜色映射

php - 波形不如应有的平滑

c++ - 在 C++ 中随机排列字符串列表