C++ 使用队列(STL库)、Windows/MingW/G++;

C++ 使用队列(STL库)、Windows/MingW/G++;,c++,debugging,stl,queue,C++,Debugging,Stl,Queue,我在使用STL库中的队列时遇到两个意外问题: 1) 我正在尝试清除队列(队列没有清除功能), 但直观的方法是给我一个核心转储: //The queue is defined Globally but the problem happens even //if i define it locally and pass it by reference. queue<pair<int,int> > Q; void yadayada () { //initialize

我在使用STL库中的队列时遇到两个意外问题:

1) 我正在尝试清除队列(队列没有清除功能), 但直观的方法是给我一个核心转储:

//The queue is defined Globally but the problem happens even
//if i define it locally and pass it by reference.
queue<pair<int,int> > Q;

void yadayada ()
{
    //initialize Q
    while (!Q.empty())
        Q.pop();   //CORE DUMP, what the hell?
}
//队列是全局定义的,但问题甚至会发生
//如果我在本地定义它并通过引用传递它。
队列Q;
void yadayada()
{
//初始化Q
而(!Q.empty())
Q.pop();//核心转储,到底是什么?
}
2) 当我从队列前端打印元素(一对)时,它是 错误地打印为(0,0)。但是当我使用元素时(返回 这对中的第二个元素)是对的

int yadayada2(...) 
{
//code...code...code

//the element in front is (4,20)
front = Q.front(); Q.pop();

cout << "(" << front.first << "," << front.second << ")" << endl;
//prints: (0,0) 
//what the hell?

//correctly returns 20
return front.second;
}

int main()
{
//code...code...code 

//prints 20!
cout << yadayada2 << endl;
}
intyadayada2(…)
{
//代码…代码…代码
//前面的元素是(4,20)
front=Q.front();Q.pop();

cout清除队列的最佳方法是:

Q = queue< pair< int, int > >(); // assign value of an empty temporary
Q=queue>();//分配空临时变量的值

至于
前端
错误,我必须同意Oli的观点,并怀疑存在无效引用。

清除队列的最佳方法是:

Q = queue< pair< int, int > >(); // assign value of an empty temporary
Q=queue>();//分配空临时变量的值
至于
前端
错误,我必须同意Oli的意见,并怀疑存在无效参考。

关于WTF:

  • 或者您的代码在现实生活中有更细微的错误(todo将int替换为其他内容,例如涉及auto_ptr、没有正确的复制/赋值语义的类等等)

  • 或者:您的mingw设置已损坏

我只是在linux和i586-mingw32msvc-g++上使用g++编译了这两个代码段,并在wine和valgrind下运行了它……没有问题:)

在WTF上:

  • 或者您的代码在现实生活中有更细微的错误(todo将int替换为其他内容,例如涉及auto_ptr、没有正确的复制/赋值语义的类等等)

  • 或者:您的mingw设置已损坏


我刚刚在linux和i586-mingw32msvc-g++上使用g++编译了这两个代码段,并在wine AND valgrind下运行了它…没有问题:)

front
是引用还是值类型?你能提供你的实际代码吗?奥利·查尔斯沃思:我修复了它,谢谢,很抱歉耽误了你的时间。如果你找到了这个问题的答案,请将其添加为此问题的答案(且仅为答案)。无需编辑您的问题以包含答案。
front
是参考还是值类型?您能提供您的实际代码吗?奥利·查尔斯沃思:我已修复,谢谢,很抱歉占用您的时间。如果您找到此问题的答案,请将其添加为答案(且仅作为答案)对于此问题。无需编辑您的问题以包含答案。您可以指出,它也会放弃任何剩余的已分配容量。这在大多数情况下会更好。您可以指出,它也会放弃任何剩余的已分配容量。这在大多数情况下会更好地采取真正的长远措施:有mig可能是运算符重载或隐式转换出错。特别是要进行长距离操作的运算符:可能是运算符重载或隐式转换出错。尤其是运算符