一、STL中queue队列内存不断增长怎么解决
定义了queue队列变量。一个线程不断的添加数据(push),另一个线程不断的读取,(pop) typedf struct{int x;int y;int z;}POINT;//声明队列queue<POINT m_data; CRITICAL_SECTION m_crit;程序初始化关键区 InitializeCriticalSection(&m_crit);主线程保存数据到队列 void SaveData(POINT*pPoint){POINT pt;pt.x=pPoint-x; pt.y=pPoint-y; pt.z=pPoint-z; EnterCriticalSection(&m_crit); m_data.push(NP); LeaveCriticalSection(&m_crit);}另一个线程读取队列 void ReadQueue(){EnterCriticalSection(&m_crit); if(!m_Qdata.empty()){POINT& pt=m_data.front(); m_data.pop();}LeaveCriticalSection(&m_crit);}在使用的过程中基本是存入一个就读取一个不存在数据堆积的情况。 effective stl第17条:使用“swap技巧”除去多余的容量。------解决方案--------------------------------------------------------那说明你的写线程执行速度比读要快。这类问题,必须要做数量限制,否则等于是你假设了:读线程比写线程快。------解决方案--------------------------------------------------------探讨引用:一直在读,push进去,deque也需要内存容纳。太多数据自然增长数据量基本上是每秒存入一条数据,每秒读取一条数据,理论上不会有大量数据堆积在队列中------解决方案--------------------------------------------------------探讨queue就是deque的包装,转发接口而已。只不过个人习惯用deque。应该查查queue是否真的没大量数据可以确定,有时候我把接收的听到,只读取当数据没有的时候,内存不减少------解决方案--------------------------------------------------------探讨我传递的是参数是个结构体都在在栈区生成的。没有涉及到堆区操作。
二、如何在C++ STL的queue当中查找一个元素
如果num的范围已知,且空间足够,那么:
bool ***[size]={false};
每次元素进队时多一步操作:(i为即将入队的值)
q.push(i);
***[i]= true;
查找的时候只需要参考***[num]就好。
这样查找比较快,时间复杂度为O(1)。
如果空间不够,或者想知道num在队中的位置,那么把整个队列遍历一遍。
queue<int>tmp;inti=1;
while(!q.empty()){
tmp.push(q.front());
q.pop();
if(tmp.rear==num) cout<<i<<endl;
i++;
}
while(!tmp.empty()){
q.push(tmp.front());
tmp.pop();
}
这样,所有值为num的元素所在的位置都可以知道了。
由于队列是动态的,所占用的空间只会多一点点。但时间复杂度为O(n)。
三、STL中的queue容器能够自己释放内存空间吗
1、queue自己不保存对象,它只是包装了deque,使用deque来保存对象;2、deque里使用了缓存技术,如果deque不析构,里面的缓冲区只会变大不会变小。可以使用deque.erase()函数释放对象;3、queue没有释放对象的方法,应该是在自身析构的时候释放;4、其实完全可以用deque,这样更直接一些,而且释放对象也方便;5、详细可以参考: www.cplusplus.com
四、c++STL中的queue pop一个元素的时候会不会释放该元素内存
1、queue自己不保存对象,它只是包装了deque,使用deque来保存对象;2、deque里使用了缓存技术,如果deque不析构,里面的缓冲区只会变大不会变小。可以使用deque.erase()函数释放对象;3、queue没有释放对象的方法,应该是在自身析构的时候释放;4、其实完全可以用deque,这样更直接一些,而且释放对象也方便;5、详细可以参考: www.cplusplus.com
好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!