我正在尝试构建一个函数,它从向量顶部删除元素,并使用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
答案 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());