前沿:為了跨平台的需要,以及效能考慮,ace建立了自己的容器。ace支援兩種容器:基於模板的、型別安全的容器,以及基於物件的容器。
基於模板的容器:允許在編譯時建立「針對特定型別的容器」;基於物件的容器:支援某一類物件型別的插入和刪除。
ace的容器包含兩類:序列容器和關聯容器。
序列容器是一種其元素按照線性順序排列的容器。由於要在容器中進行迭代,各個元素的順序不會改變。列表、棧、佇列、陣列和集合都是ace的一些類所代表的序列的例子。
1、雙向鍊錶
雙向鍊錶在序列中同時維護有向前和向後的鏈結,從而可以在序列中進行高效的向前和向後遍歷。但不能對元素進行隨機訪問。
ace_dllist是ace提供的雙向鍊錶。它是乙個基於模板的容器,所以我們需要預先指定我們的列表中使用的元素的型別。
2、雙向鍊錶測試**
(1)雙向鍊錶元素定義:dataelement(dataelement.h)
//dataelement元素有乙個很好的特性:即它會記住自己現在有多少個例項
//雙向鍊錶測試,以下定義的是鍊錶元素型別
class dataelement
dataelement(int data):data_(data)
dataelement(const dataelement& e)
dataelement& operator=(const dataelement& e)
bool operator==(const dataelement& e)
~dataelement()
int getdata(void)const
void setdata(int val)
static int numofactiveobjects(void)
private:
int data_;
static int count_;
};(2)測試類定義:listtests(listtests.h)
#pragma once
#include "ace/containers.h"
#include "dataelement.h"
//雙向鍊錶測試
//雙向鍊錶支援前向和後向迭代
typedef ace_dllistmylist;//該容器可以儲存元素物件,也可以儲存指向物件的指標
class listtests
;(3)測試類實現(listtests.cpp)
#define ace_ntrace 0
#include "listtests.h"
int dataelement::count_=0;//必須對靜態成員進行初始化
listtests::listtests(void)
listtests::~listtests(void)
int listtests::run(void)
//迭代顯示列表
this->displaylist(list1);
ace_debug((lm_debug,ace_text("#of live objects:%d/n"),dataelement::numofactiveobjects()));
//從除錯情況來看,數目為100
//建立list1的乙個拷貝
mylist list2;
list2=list1;//此處為淺拷貝
//迭代顯示拷貝列表的內容
this->displaylist(list2);
ace_debug((lm_debug,ace_text("#of live objects:%d/n"),dataelement::numofactiveobjects()));
//從除錯情況來看,物件數目仍然是100
//清除拷貝列表和其所有元素
//因為兩個列表有相同的元素,
//這將導致list1包含的指標所指向的資料元素已經被銷毀。
this->destorylist(list2);
ace_debug((lm_debug,ace_text("#of live objects:%d/n"),dataelement::numofactiveobjects()));
//從除錯情況來看,物件數目為0
//所有列表本身將在此被清理。注:列表析構函式將銷毀任何列表拷貝,無論其包含什麼資料
//因為在這種情況下,列表包含指向資料元素的指標,此處是銷毀這些資料元素的唯一機會。
return 0;
}// 使用迭代器,顯示列表
void listtests::displaylist(mylist& list)
ace_debug((lm_debug,ace_text("/n")));
ace_debug((lm_debug,ace_text("reverse iteration /n")));
//後向迭代器
ace_dllist_reverse_iteratorriter(list);
while(!riter.done())
ace_debug((lm_debug,ace_text("/n")));
}// 銷毀物件
void listtests::destorylist(mylist& list)
}(4)入口函式
// container_practice.cpp : 定義控制台應用程式的入口點。
//#define ace_ntrace 0
#include "ace/containers.h"
#include "listtests.h"
typedef ace_dllistmylist;
int ace_tmain(int argc, ace_tchar* ar**)
ACE篇之一 使用ACE日誌設施
1 前言 使用ace日誌設施的主要巨集如下 ace debug 常用 用於除錯語句 ace error 常用 用於警告和錯誤 ace trace 用於跟蹤資訊 2 新建控制台專案log practice vs2008 3 刪除自動生成的其它所有檔案,僅僅保留log practice.cpp檔案 4 ...
ACE篇之一 使用ACE日誌設施
1 前言 使用ace日誌設施的主要巨集如下 ace debug 常用 用於除錯語句 ace error 常用 用於警告和錯誤 ace trace 用於跟蹤資訊 2 新建控制台專案log practice vs2008 3 刪除自動生成的其它所有檔案,僅僅保留log practice.cpp檔案 4 ...
ACE篇之九 ACE容器之五(集合)
1 前言 集合是不允許其所含條目重複的序列。ace有兩種集合 有界集合和無界集合,即ace bounded set和ace unbounded set。它們支援插入 查詢 迭代。2 測試完整源 如下 原書本有多處錯誤 include ace containers.h include dataelem...