在deque实现中将1/2矢量移动到另一个矢量

时间:2017-03-12 05:55:44

标签: c++ for-loop vector

我正在为代码中不使用向量擦除功能的双端队列实现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上的最后一个元素,就是双端队列的前面。

1 个答案:

答案 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