ACE篇之五 ACE容器之一(雙向鍊錶)

2021-09-30 08:50:46 字數 2806 閱讀 8804

前沿:為了跨平台的需要,以及效能考慮,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...