關於C 中的順序容器

2021-06-06 23:09:41 字數 3268 閱讀 4440

本文參考了

1、順序容器包括:vector,list,deque

2、接受容器大小做形參的建構函式只適用於順序容器,而關聯容器不支援這種初始化。

3、作為容器元素型別必須滿足以下兩個約束:

一、元素型別必須支援賦值運算。

二、元素型別的物件必須可以複製。

上面的兩條是最低限度的元素型別約束。除了引用型別外,所有內建或復合型別都可用做元素型別。

4、只有vector和deque容器提供以下兩種重要的運算集合:

一、迭代器算術運算:iter+n

iter-n

iter1+=iter2

iter1-=iter2

iter1-iter2

二、除了==和!=之外的關係操作符來比較兩個迭代器:>、>=、

5、關於新增,插入或刪除元素可能會使迭代器失效

關於這個問題首先要弄清楚vector,list,deque在記憶體中是怎樣儲存的:

vector容器的元素以連續的方式存放——每乙個元素都緊挨著前乙個元素儲存。所以當容器中已經沒有空間容納新的元素,vector必須重新分配儲存空間,用來存放原來的元素以及新新增的元素。在vector中某個位置插入乙個元素時,該位置後面的元素都要向後移動了。刪除某個元素道理與插入一樣。

list容器表示不連續的記憶體區域,list儲存類似於鍊錶,故插入或刪除list容器中的乙個元素不需要移動任何其他元素。

下面我給出兩端**來證明vector和list的儲存方式:

#include

#include

#include

using namespace std;

int main()

執行結果是:

這樣明白了吧:swap交換的不是兩個容器中的內容而是兩個容器中儲存的位址!所以這樣交換前的迭代器也不會失效了!

再貼乙個程式例項:

#include

#include

#include

#include

int main()

// vector 

std::vectormyvector;

// 乙個 vector 就像乙個動態的一維陣列19樓空間'qe7mei2fa@

// 宣告乙個存放 100 個 0 的整數的 vector

// 返回 vector 的大小, 即元素的個數

std::cout << myvec.size() << std::endl;

// 刪除 vector 末尾的元素, vector 的大小相應減1

myvec.pop_back();

// 在 vector 的末尾新增元素

myvec.push_back(10);

// 返回 vector 末尾的元素

std::cout << myvec.back() << std::endl;

// 清除 vector 所有元素, vector 的個數為 0

myvec.clear();

std::cout << myvec.size() << std::endl;

// std::cout << myvec[1] << std::endl;    //這種方法訪問越界會異常

// std::cout << myvec.at(5) << std::endl; //這種方法訪問越界會異常

// 遍歷

// 遍歷方法1, 推薦

for(std::vector::iterator iter_1 = myvec.begin(); iter_1 != myvec.end(); iter_1++)

std::cout << (int)*iter_1 << std::endl;

// 遍歷方法2, 不推薦, 原因忘記

for(int i = 0; i <= myvec.size(); i++)

std::cout << myvec[i] << std::endl;

// set

// set 是集合, 但 set中不能包含重複的元素, 這是與 vector 的區別

std::setmyset;

myset.insert(10); // 插入元素19樓空間w1rn j3a

myset.insert(10); // 沒用, 插入失敗, 因為不能有重複元素

myset.erase(10);  // 刪除元素,如果元素存在的話

myset.size();

myset.clear();

// list 相當於乙個列表

std::listmylist;

mylist.push_back(100);

mylist.remove(100);

/**   vector用的是隨機訪問迭代器,list用的是雙向迭代器

*   

*   如果我們需要隨機訪問乙個容器則vector   要比list   好得多  

*   如果我們已知要儲存元素的個數則vector   又是乙個比list   好的選擇   

*   如果我們需要的不只是在容器兩端插入和刪除元素則list   顯然要比vector   好   

*   除非我們需要在容器首部插入和刪除元素否則vector   要比deque   好

8]u;k z*c;r{0  */

return 0;

幾種順序容器的有缺點:

vector 就是一頭開口的佇列,所以就是一般意義上的佇列。

deque 是兩頭開口的。既能往前插也能往後插。

但是它兩都一樣,如果非要往中間插,就得騰地。vector 沒辦法,不管往哪插都得往後挪,所以你往第乙個插最慘,整個序列都要複製。deque 好一點,如果你插入的位置比較靠前,它會想辦法把前面的部分往前挪來騰地。所以最慘的是往中間插。

但是它們的訪問效率都很高,vector 只要用首位址,加偏移量就可以直接找到要訪問的元素。deque 稍微複雜,但總的來說,訪問的位置也是直接算出來的,所以它們的訪問時間都是常數 o(1)。

list 和它們思路不一樣。你可以自由的在任何位置插入,插入時間是常數。但訪問很慢,它根本不知道你要找的元素在**,只能從頭遍歷。

關於C 中的容器

關於c 中的容器 c 中的容器類包括 順序儲存結構 和 關聯儲存結構 前者包括vector,list,deque等 後者包括set,map,multiset,multimap等。若需要儲存的元素數在編譯器間就可以確定,可以使用陣列來儲存,否則,就需要用到容器類了。1 vector 連續儲存結構,每個...

C 順序容器

一 順序容器型別 順序容器 vector list deque 介面卡 stack queue priority queue 使用這些容器都必須使用相應的標頭檔案 二 容器元素初始化 cc 建立乙個名為c的空容器 cc c2 建立容器c2的副本 cc b,e 建立c,其元素是迭代器b和e的範圍內的副...

C 順序容器

1 概述 乙個容器就是一些特定型別物件的集合。順序容器型別 描述vector 可變大小陣列,支援快速訪問,在尾部之外的地方插入或刪除時可能很慢 deque 雙端佇列。支援快速訪問,在頭尾插入刪除會很快。list 雙向列表。只支援雙向順序訪問。插入刪除很快 forward list 單向列表。只支援單...