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...