C 與C STL的容器對應說明

2021-07-15 07:22:19 字數 3660 閱讀 4736

dotnet

下的泛型容器類封裝在

system.collections.generic

,使用的十分廣泛。

c++則靠

stl實現了泛型容器與演算法。下面對二者做乙個對比,只談用法,不深究原理。對比的內容有陣列、鍊錶和字典三種結構。

一、陣列

c#使用list

,c++

用的是std::vector

,內部實現都是陣列,也就是一塊連續的記憶體區域,插入、刪除操作慢,隨機訪問速度快。

操作c++(stl)

c#(.net)

說明包含

#include

using system.collections.generic;

c++中也可以using namespace std;

宣告std::vectorarray;

listarray = new list();

以int型資料為例

迭代器宣告

std::vector::iterator iter=array.begin();

list.enumerator iter = array.getenumerator();

c#中迭代器不常用

插入array.push_back(4); 

array.insert(iter,51);

array.add(4); 

array.insert(2, 51);

迭代器操作後失效

查詢int val=array[0]; 

val=array.at(1);  //進行下標檢測

int val = array[0]; 

array.contains(5); //是否包含5 

array.indexof(1);  //元素1的下標

刪除array.pop_back();  //刪除最後的元素 

array.erase(iter);  //刪除iter位置的元素 

array.clear();

array.remove(1);  //刪除"1」這個元素 

array.removeat(0);  //刪除0號元素 

array.clear();

迭代器操作後失效

大小array.empty(); 

array.capacity();  //容量(根據當前非配的記憶體) 

array.size();  //元素數

array.count;  //元素數 

array.capacity;  //容量

遍歷for (std::vector::size_type i=0;ifor (int i = 0; i < array.count; i++){} 

while (iter.movenext()){} 

foreach (int d in array){}

c++中第二種常用,c#中第三種常用(我是這麼覺得……)

排序std::sort(array.begin(),array.end());

array.sort();

c++中要#include ,上面的for_each也是

二、鍊錶

c#使用linkedlist

,c++

用的是std::list

,內部實現都是鍊錶,插入、刪除速度快,隨機訪問速度慢。鍊錶的操作與陣列十分相似,不同的地方大致有:

1. 任何通過下標訪問的方式都是無效的,檢視容量也是無效的,這是由鍊錶的性質決定的。對鍊錶的查詢操作要通過迭代器進行。也就是說,上表中「查詢

」、「遍歷

」的第一種方法、「大小

」中的容量都是非法操作。

2. 插入刪除的時候也不能指定下標,

c++中除了

push_back()

外,多了乙個

push_front(),c#

中不能使用

add()

、insert()

,要使用

addbefore()/addafter()/addfirst()/addlast()。

3. 排序在c++

中直接用

list.sort()。

4. std::list

要加標頭檔案:

#include

三、字典

c#中使用dictionary

,c++

使用std::map

。map

的內部實現是紅黑樹,

dictionary

的實現是雜湊表。

dotnet

中也有用樹實現的字典類結構,叫

sorteddictionary

,似乎用得不多,效率也沒有雜湊表高,不過可以保持插入的資料是有序的。下面的對比是通過字串來檢索整數,為了寫起來方便,

c++中字串直接用了

lpctstr

,並且typedef std::mapmap_type;

操作c++(stl)

c#(.net)

說明包含

#include

using system.collections.generic;

宣告map_type map; 

map_type::iterator iter=map.begin();

dictionarymap = new dictionary();

如果是自定義的key型別,c++中需要過載比較運算子;c#中可自定義相等比較器

插入map[_t("first")]=5; 

map.insert(map_type::value_type(_t("second"),2)); 

map.insert(map_type::value_type(_t("second"),3));    //不覆蓋,不異常

map.add("first", 5); 

map["second"] = 2;  //這種操作已經進行了插入 

"second", 3);    //重複異常

刪除map.erase(iter);  //iter有效且不等於map.end() 

map.erase(_t("first")); 

map.clear();

map.remove("first"); 

map.clear();

查詢int val=map[_t("second")];  //沒有則構造新的 

iter=map.find(_t("first")); 

if (iter!=map.end()) 

val=iter->second;

int data = map["second"];    //不存在則異常 

map.containskey("third"); 

map.containsvalue(5); 

map.trygetvalue("hello", out data);

注意c++中下標檢索時如果不存在這個元素也不產生錯誤

遍歷for (iter=map.begin();iter!=map.end();++iter) 

foreach (keyvaluepairpair in map) 

大小map.size(); 

map.empty();  //是否為空

map.count;

以上便是三種常用的資料結構的用法對比,其實我對這些內容不熟悉,所以有錯誤的地方請見諒。

C STL容器適用情況的說明

各種容器的特性 vector 典型的序列容器,c 標準嚴格要求次容器的實現記憶體必須是連續的,唯一可以和標準 c相容的 stl容器,任意元素的讀取 修改具有常數時間複雜度,在序列尾部進行插入 刪除是常數時間複雜度,但在序列的頭部插入 刪除的時間複雜度是 o n 可以在任何位置插入新元素,有隨機訪問功...

C STL 中 map 容器的說明和使用技巧

map是stl的乙個關聯容器,它提供一對一 其中第乙個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值 的資料 處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。這裡說下map內部資料的組織,map內部自建一顆紅黑樹 一 種非嚴格意...

C STL容器的理解

1.容器 資料結構 演算法。相當於是為複雜的資料設計一種專門用於存放該資料的東西。用於開發中傳遞複雜的資料。2.模板函式只能寫在標頭檔案中,不能單獨宣告。3.stl容器分為三類 1 順序容器類 vector 陣列。查詢快,插入慢。加入的資料與資料大小有關 操作 empty 返回bool型,表示vec...