我正在尝试构建一个函数,该函数使用 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/