获取作为 Class 变量的双端队列大小时的未定义行为
Undefined Behavior When Getting the Size of Deque which is a Class Variable
我使用两个双端队列作为 class 变量来实现一个数据结构,以允许高效地添加到中间。
因此,每当我向我的 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++ 中 Class 的理解有什么地方不对吗?
deque.size()
returns size_type
的值,即 unsigned。所以如果你得到一个负值,你会得到一个非常大的正值。
我使用两个双端队列作为 class 变量来实现一个数据结构,以允许高效地添加到中间。 因此,每当我向我的 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++ 中 Class 的理解有什么地方不对吗?
deque.size()
returns size_type
的值,即 unsigned。所以如果你得到一个负值,你会得到一个非常大的正值。