队列(Queue)

队列(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
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值