我正在为代码中不使用向量擦除功能的双端队列实现pop_front()
/ pop_back()
成员函数。基本上,这是任务:
pop_front()
如果vecOne
为空,则vecTwo
中元素的前半部分移至vecOne
,然后移至pop_back()
vecOne
被称为。pop_back()
如果vecTwo
为空,则vecOne
中元素的前半部分移至vecTwo
,然后移至pop_back()
vecTwo
} 叫做。 我编写了以下代码,但它并不适用于所有情况:
template <class T>
void Deque <T>::pop_front()
{
if (vecOne.empty() && vecTwo.empty()) {
return;
}
if (vecOne.empty()) {
if (vecTwo.size() == 1) {
vecTwo.pop_back();
} else {
for (int i = (vecTwo.size()-1)/2; i > -1; --i) {
vecOne.push_back(vecTwo[i]);
vecTwo[i] = vecTwo.back();
vecTwo.pop_back();
}
vecOne.pop_back();
}
} else {
vecOne.pop_back();
}
}
E.g。假设第一个向量vecOne
没有元素,vecTwo
有5个(60, 70, 80, 90, 100)
。在这段代码中,我将得到以下结果:
vecOne
按顺序排列着60,70和80(这是我应该得到的)
vecTwo
的数字为100和90(这是乱序的)。
如果我想让vecTwo
中的前1/2个元素转移到vecOne
然后留下剩余的{{1},我希望有人可以帮助我理解我做错了什么。 {} {}} vecTwo
pop_back
上的最后一个元素,就是双端队列的前面。
答案 0 :(得分:0)
这是因为vecTwo没有偶数个元素。 那么会发生什么:
vecTwo分为{50,60,70}以移至vecOne和{90,100}以保持vecTwo。
初始:
v1 = {};
v2 = {60, 70, 80, 90, 100}
i = 2
v1 = {80};
v2 = {60, 70, 100, 90}
i = 1
v1 = {80, 70};
v2 = {60, 90, 100}
i = 0
v1 = {80, 70, 60}
v2 = {100, 90}
要解决这个问题,您需要检查vecTwo的大小是否不均匀,只需将其推送到vecOne并跳过移动并弹回vecTwo。
int i = (size - 1) / 2
if (size % 2 != 0) // if not even
{
vecOne.push_back(vecTwo[i]);
--i;
}
while(i != 0)
{
// do what you do now in the for loop
}
if (size % 2 != 0) vecTwo.pop_back(); // if we skipped one pop it now