队列(Queue)
ACE通过ACE_Unbounded_Queue模板容器,实现队列的数据结构。ACE的队列允许在队列的头部插入元素也允许在队列的尾部插入元素,但是取出都是从头部取出。1)
示例代码
Queues.cpp
此示例演示了分别从栈上和堆上分配空间存储对象元素,并且从头部和尾部分别插入对象元素,以及通过迭代对对象元素进行遍历。
// Queues.cpp,v 1.5 2006/03/30 12:40:48 jwillemsen Exp
#include "ace/OS_Memory.h"
#include "ace/Log_Msg.h"
#include "ace/Containers.h"
#include "DataElement.h"
class QueueExample
{
public:
// Illustrate the various ACE Queues.
int run (void);
private:
// Illustrate the ACE unbounded queue
// that has copies of the data elements.
int runStackUnboundedQueue (void);
// Illustrate the ACE unbounded queue
// with pointers to elements on the heap.
int runHeapUnboundedQueue (void);
};
int QueueExample::run (void)
{
ACE_TRACE (ACE_TEXT ("QueueExample::run"));
// Illustrate the queue with elements on the stack.
if (this->runStackUnboundedQueue () != 0)
{
return -1;
}
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("/n# of live objects %d/n"),
DataElement::numOfActiveObjects ()));
// Illustrate the queue with elements on the heap.
if (this->runHeapUnboundedQueue () != 0)
{
return -1;
}
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("/n# of live objects %d/n"),
DataElement::numOfActiveObjects ()));
return 0;
}
// Listing 1 code/ch05
//从栈上分配元素并从队列的头部和尾部分别插入元素,并对数据元素进行遍历
int QueueExample::runStackUnboundedQueue (void)
{
ACE_TRACE (ACE_TEXT ("QueueExample::runStackUnboundedQueue"));
ACE_Unbounded_Queue<DataElement> queue;
DataElement elem1[10];
int i;
for (i = 0; i < 10; i++)
{
elem1[i].setData (9-i);
queue.enqueue_head (elem1[i]);
}
DataElement elem2[10];
for (i = 0; i < 10; i++)
{
elem2[i].setData (i+10);
queue.enqueue_tail (elem2[i]);
}
for (ACE_Unbounded_Queue_Iterator<DataElement> iter (queue);
!iter.done ();
iter.advance ())
{
DataElement *elem = 0;
iter.next (elem);
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%d:"), elem->getData ()));
}
return 0;
}
// Listing 1
// Listing 2 code/ch05
//从堆上分配数据元素并进行遍历
int QueueExample::runHeapUnboundedQueue (void)
{
ACE_TRACE (ACE_TEXT ("QueueExample::runHeapUnboundedQueue"));
ACE_Unbounded_Queue<DataElement*> queue;
for (int i = 0; i < 20; i++)
{
DataElement *elem;
ACE_NEW_RETURN(elem, DataElement (i), -1);
//队列中存储传入指针的副本
queue.enqueue_head (elem);
}
for (ACE_Unbounded_Queue_Iterator<DataElement*> iter
= queue.begin ();
!iter.done ();
iter.advance ())
{
DataElement **elem = 0;
iter.next(elem);
ACE_DEBUG
((LM_DEBUG, ACE_TEXT ("%d:"), (*elem)->getData ()));
//elem指向的对象元素被释放,可是队列中的指针依然存在,只不过是存储的无效指针。
delete (*elem);
}
return 0;
}
// Listing 2
int ACE_TMAIN (int, ACE_TCHAR *[])
{
QueueExample que;
return que.run ();
}
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class ACE_Node<DataElement>;
template class ACE_Node<DataElement*>;
template class ACE_Unbounded_Queue<DataElement*>;
template class ACE_Unbounded_Queue_Iterator<DataElement*>;
template class ACE_Unbounded_Queue<DataElement>;
template class ACE_Unbounded_Queue_Iterator<DataElement>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
#pragma instantiate ACE_Node<DataElement>
#pragma instantiate ACE_Node<DataElement*>
#pragma instantiate ACE_Unbounded_Queue<DataElement*>
#pragma instantiate ACE_Unbounded_Queue_Iterator<DataElement*>
#pragma instantiate ACE_Unbounded_Queue<DataElement>
#pragma instantiate ACE_Unbounded_Queue_Iterator<DataElement>
#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION*/
执行结果
D:/project/ACE_wrappers/examples/APG/Containers>Queues
0:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:
# of live objects 0
19:18:17:16:15:14:13:12:11:10:9:8:7:6:5:4:3:2:1:0:
# of live objects 0