ACE_DLList双向链表

ACE内存分配宏:

      ACE_NEW ( P, C)  ///使用构造器c分配内存,并把指针赋给p。在失败时,p被设置为0并执行return;

      ACE_NEW_RETURN ( P, C, R)  ///使用构造器c分配内存,并把指针赋给p。在失败时,p被设置为0并执行return r;

      ACE_NEW_NORETURN ( P, C)  ///使用构造器c分配内存,并把指针赋给p。在失败时,p被设置为0并执行下一条语句;

ACE日志宏:

      ACE_ASSERT( TEST );   //测试失败,打印一条断言消息,然后应用终止。

      ACE_RETURN( VALUE );  //不打印消息,发出调用的函数会返回,返回值为value;op_status被设为value;

      ACE_DEBUG ( ( Severity, formatting-args ) );

      ACE_ERROR ( ( Severity, formatting-args ) );

      ACE_TRACE ( STRING );

ACE_DLList: 双向链表在序列中同时维护有向前和后向的链接,从而可以高效的进行向前或向后的遍历,但不能对元素进行随机访问。它是一个引用容器,而非值容器,它只存储指向你插入其中的值得指针。以下DataElement会记住自己现在有多少个实例。

main.cpp

#include "ListTest.h"

int DataElement::count_=0; 

#pragma comment(lib, "E:\\ACE_wrappers\\lib\\ACEd.lib") 

int ACE_TMAIN(int, ACE_TCHAR *[])//int main()
{
	ListTest mylist;

	return mylist.run();
}

DataElement

class DataElement
{
	friend class DataElementEx;

public:
	DataElement() { count_++; }

	DataElement(int data):data_(data) { count_++; }

	DataElement(const DataElement & e)
	{
		data_=e.getData();
		count_++;
	}

	DataElement & operator= (const DataElement & e)
	{
		data_=e.getData();
		return *this;
	}

	bool operator== (const DataElement & e)
	{ return this->data_==e.data_; }

	~DataElement() { count_--; }

	int getData(void) const { return data_; }

	void setData(int val) { data_=val; }

	static int numOfActiveObjects(void) { return count_; }

private:
	int data_;
	static int count_;
};

listTest类:

// ListTest.h: interface for the ListTest class.
//
//

#if !defined(AFX_LISTTEST_H__BA088283_594B_4459_9950_6E3DC1FA5D48__INCLUDED_)
#define AFX_LISTTEST_H__BA088283_594B_4459_9950_6E3DC1FA5D48__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "DataElement.h"
#include "ace/Containers.h"

typedef ACE_DLList<DataElement> MyList;

class ListTest  
{
public:
	ListTest();
	virtual ~ListTest();
	int run(void);
	void displayList(MyList & list);
	void destroyList(MyList & list);

};

#endif // !defined(AFX_LISTTEST_H__BA088283_594B_4459_9950_6E3DC1FA5D48__INCLUDED_)

实现文件:

// ListTest.cpp: implementation of the ListTest class.
//
//

#include "ListTest.h"

//
// Construction/Destruction
//

ListTest::ListTest()
{

}

ListTest::~ListTest()
{

}

int ListTest::run()
{
	ACE_TRACE(ACE_TEXT("ListTest::run"));

	MyList list1;

	for(int i=0; i<100; i++)
	{
		DataElement *element;
		ACE_NEW_RETURN (element, DataElement(i), -1);
		list1.insert_tail(element);
	}
	this->displayList(list1);

	MyList list2;
	list2=list1;

	this->displayList(list2);

	this->destroyList(list2);

	ACE_DEBUG((LM_DEBUG,ACE_TEXT("# of live objects: %d\n"),DataElement::numOfActiveObjects()));
	
	return 0;
}

void ListTest::displayList(MyList & list)
{
	ACE_TRACE(ACE_TEXT("ListTest::displayTest"));

	ACE_DEBUG((LM_DEBUG,ACE_TEXT("Forward iteration\n")));
	ACE_DLList_Iterator<DataElement> iter(list);
	while(!iter.done())
	{
		ACE_DEBUG((LM_DEBUG,ACE_TEXT("%d:"),iter.next()->getData()));
		iter++;
	}

	ACE_DEBUG((LM_DEBUG,ACE_TEXT("\n")));

	ACE_DEBUG((LM_DEBUG,ACE_TEXT("Reverse Iteration\n")));

	ACE_DLList_Reverse_Iterator<DataElement> riter(list);

	while(!riter.done())
	{
		ACE_DEBUG((LM_DEBUG,ACE_TEXT("%d:"),riter.next()->getData()));
		riter++;
	}
	ACE_DEBUG((LM_DEBUG,ACE_TEXT("\n")));
}

void ListTest::destroyList(MyList & list)
{
	ACE_TRACE(ACE_TEXT("ListTest::destroyTest"));

	ACE_DEBUG((LM_DEBUG,ACE_TEXT("Destroy data element\n")));

	for(ACE_DLList_Iterator<DataElement> iter(list);
	!iter.done();
	iter++)
	{
		DataElement *de=iter.next();
		delete de;
	}
}

打印结果:

Forward iteration
0:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24:25:26:27:28:29:
30:31:32:33:34:35:36:37:38:39:40:41:42:43:44:45:46:47:48:49:50:51:52:53:54:55:56
:57:58:59:60:61:62:63:64:65:66:67:68:69:70:71:72:73:74:75:76:77:78:79:80:81:82:8
3:84:85:86:87:88:89:90:91:92:93:94:95:96:97:98:99:
Reverse Iteration
99:98:97:96:95:94:93:92:91:90:89:88:87:86:85:84:83:82:81:80:79:78:77:76:75:74:73
:72:71:70:69:68:67:66:65:64:63:62:61:60:59:58:57:56:55:54:53:52:51:50:49:48:47:4
6:45:44:43:42:41:40:39:38:37:36:35:34:33:32:31:30:29:28:27:26:25:24:23:22:21:20:
19:18:17:16:15:14:13:12:11:10:9:8:7:6:5:4:3:2:1:0:
Forward iteration
0:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24:25:26:27:28:29:
30:31:32:33:34:35:36:37:38:39:40:41:42:43:44:45:46:47:48:49:50:51:52:53:54:55:56
:57:58:59:60:61:62:63:64:65:66:67:68:69:70:71:72:73:74:75:76:77:78:79:80:81:82:8
3:84:85:86:87:88:89:90:91:92:93:94:95:96:97:98:99:
Reverse Iteration
99:98:97:96:95:94:93:92:91:90:89:88:87:86:85:84:83:82:81:80:79:78:77:76:75:74:73
:72:71:70:69:68:67:66:65:64:63:62:61:60:59:58:57:56:55:54:53:52:51:50:49:48:47:4
6:45:44:43:42:41:40:39:38:37:36:35:34:33:32:31:30:29:28:27:26:25:24:23:22:21:20:
19:18:17:16:15:14:13:12:11:10:9:8:7:6:5:4:3:2:1:0:
Destroy data element
# of live objects: 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值