首页 > 解决方案 > 获取作为类变量的 Deque 的大小时的未定义行为

问题描述

我使用两个双端队列作为类变量来实现一个数据结构,以允许有效地添加到中间。因此,每当我向我的 DS 添加一个元素时,如果两个双端队列的大小差异大于 1,这两个双端队列将重新平衡自身,如 rebalace() 所示。

但是, (deque2.size() - deque1.size()) > 1 的条件没有按预期工作。第一个元素将始终被推送到 deque1,它的大小为 1,而 deque2 的大小为 0。然而,当我调试时, (deque2.size() - deque1.size()) 评估为一些非常大的整数并导致条件为真。

当我尝试使用局部变量来存储双端队列的大小及其大小差异时。它按预期工作。

class teque{
private:
    deque<ui> firstHalf;  
    deque<ui> secondHalf;
    void rebalance(){
        int size1 = firstHalf.size();
        int size2 = secondHalf.size();
        int diff1 = firstHalf.size() - secondHalf.size();
        int diff2 = secondHalf.size() - firstHalf.size();
        if(firstHalf.size() == secondHalf.size()) return;
        else if (firstHalf.size() - secondHalf.size() > 1){
            secondHalf.push_front(firstHalf.back());
            firstHalf.pop_back();
        }
        else if ((secondHalf.size() - firstHalf.size()) > 1){ //Didn't work as expected
            cout << (secondHalf.size() - firstHalf.size()); //Output a very large number
            firstHalf.push_back(secondHalf.front());
            secondHalf.pop_front();
        }
        //debug();
    }
public:
    teque() {};
    void push_back(ui ele){
        firstHalf.size() == 0 ? firstHalf.push_back(ele) : secondHalf.push_back(ele);
        rebalance();
    }
    void push_front(ui ele){
        firstHalf.push_front(ele);
        rebalance();
    }
    void push_middle(ui ele){
        firstHalf.push_back(ele);
        rebalance();
    }
    ui get (ui index){
        if(index < firstHalf.size()) return firstHalf[index];
        else //if(index >= firstHalf.size()) 
            return secondHalf[index-firstHalf.size()];
    }

int main(){
    teque test = teque();
    teque.push_back(9);
}

是不是我对 C++ 中的类的理解在某些地方是错误的?

标签: c++deque

解决方案


deque.size()返回 的值size_type,它是无符号的。所以如果你得到一个负值,你会得到一个非常大的正值。


推荐阅读