亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

c++ STL容器總結之:vertor與list的應用

2020-01-26 16:15:27
字體:
來源:轉載
供稿:網友

STL提供六大組件,彼此可以組合套用

1、容器(containers):各種數據結構,如vertor,list,deque,set,map.從實現的角度來看,STL容器是一種class template

2、算法(algorithms):各種算法如sort,search,copy,earse。STL算法是一種 function template。

3、迭代器(iterators):扮演容器與算法之間的膠合劑,是所謂的“泛型指針”。所有STL容器都有自己的專屬的迭代器。

4、仿函數(functors):行為類似函數,可以作為算法的某些策略。從實現的角度來看,仿函數是一種重載了operator()的class或class template。

5、配接器(adapters):一種用來修飾容器或仿函數或迭代器借口的東西。例如queue和stack

6、配置器(allocators):負責空間的配置與管理。配置器是一個實現了動態空間分配、空間管理、空間釋放的class template。

STL是建立在泛化之上的。數組泛化為容器,參數化了所包含的對象的類型。函數泛化為算法,參數化了所用的迭代器的類型。指針泛化為迭代器,參數化了所指向的對象的類型。

vector、string、deque和list被稱為標準序列容器,

set、multiset、map和multimap是標準關聯容器。

非標準序列容器slist和rope。slist是一個單向鏈表,rope本質上是一個重型字符串。

非標準關聯容器hash_set、hash_multiset、hash_map和hash_multimap。

標準非STL容器,包括數組、bitset、valarray、stack、queue和priority_queue。

迭代器被分成五個種類:

輸入迭代器是每個迭代位置只能被讀一次的只讀迭代器。

輸出迭代器是每個迭代位置只能被寫一次的只寫迭代器。

輸入和輸出迭代器被塑造為讀和寫輸入和輸出流(例如,文件)。

前向迭代器有輸入和輸出迭代器的能力,但是它們可以反復讀或寫一個位置。

雙向迭代器就像前向迭代器,除了它們的后退可以像前進一樣容易。標準關聯容器都提供雙向迭代器。list也有。

連續內存容器(也叫做基于數組的容器)在一個或多個(動態分配)的內存塊中保存它們的元素。如果一個新元素被查入或者已存元素被刪除,其他在同一個內存塊的元素就必須向上或者向下移動來為新元素提供空間或者填充原來被刪除的元素所占的空間。這種移動影響了效率和異常安全。標準的連續內存容器是vector、string和deque。非標準的rope也是連續內存容器。

基于節點的容器在每個內存塊(動態分配)中只保存一個元素。容器元素的插入或刪除只影響指向節點的指針,而不是節點自己的內容。所以當有東西插入或刪除時,元素值不需要移動。表現為鏈表的容器――比如list和slist――是基于節點的,所有的標準關聯容器也是(它們的典型實現是平衡樹)。非標準的散列容器使用不同的基于節點的實現。

1、vector

vector和數組類似,它擁有一段連續的內存空間,并且起始地址不變,因此它能非常好的支持隨機存取(即使用[]操作符訪問其中的元素),但由于它的內存空間是連續的,所以在中間進行插入和刪除會造成內存塊的拷貝(復雜度是O(n)),另外,當該數組后的內存空間不夠時,需要重新申請一塊足夠大的內存并進行內存的拷貝。這些都大大影響了vector的效率。

vector不是一種數據類型,而只是一個類模板,可用來定義任意多種數據類型。vector類型的每一種都指定了其保存元素的類型。因此,vector<int>和vector <string>都是數據類型。

 

vector對象的定義和初始化

vector<T>  v1;

vector保存類型為T的對象。默認構造函數v1為空。

vector<Tv2(v1);

v2v1的一個副本。

vector<Tv3(ni);

v3包含n個值為i的元素。



vector<int> ivec4(10, -1);     // 10 elements, each initialized to -1

vector<string> svec(10, "hi!"); // 10 strings, each initialized to "hi!"

vector的操作

v.empty()

如果v為空,則返回true,否則返回false。

v.size()

返回v中元素的個數。

v.push_back(t)

v的末尾增加一個值為t的元素。

v[n]

返回v中位置為n的元素。

v1 v2

v1的元素替換為v2中元素的副本。

v1 == v2

如果v1v2相等,則返回true

!=, <, <=, >, >=

保持這些操作符慣有的含義。

向vector添加元素:

復制代碼 代碼如下:

string word;

vector<string> text;        // empty vector

while (cin >> word) {

    text.push_back(word);  // append word to text

}
  vector的下標操作:


for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)

    ivec[ix] = 0;

vector迭代器

每種容器都定義了一對命名為begin和end的函數,用于返回迭代器。如果容器中有元素的話,由begin返回的迭代器指向第一個元素:

復制代碼 代碼如下:

vector<int>::iterator iter = ivec.begin();

由end操作返回的迭代器指向vector的“末端元素的下一個”。通常稱為超出末端迭代器(off-the-end iterator),表明它指向了一個不存在的元素。如果vector為空,begin返回的迭代器與end返回的迭代器相同。
復制代碼 代碼如下:

for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)

    *iter = 0;  // set element to which iter refers to 0

const_iterator

前面的程序用vector::iterator改變vector中的元素值。每種容器類型還定義了一種名為const_iterator的類型,該類型只能訪問容器內元素,但不能改變其值。

復制代碼 代碼如下:

for (vector<string>::const_iterator iter = text.begin();  iter != text.end(); ++ iter)

    *iter = " ";     // error: *iter is const

2、list

list是由數據結構中的雙向鏈表實現的,因此它的內存空間可以是不連續的。因此只能通過指針來進行數據的訪問,這個特點使得它的隨機存取變的非常沒有效率,需要遍歷中間的元素,搜索復雜度O(n),因此它沒有提供[]操作符的重載。但由于鏈表的特點,它可以以很好的效率支持任意地方的刪除和插入。

list::iterator與vector::iterator的一些不同:

復制代碼 代碼如下:

#include <iostream>
#include <vector>
#include <list>
using namespace std;

int main( void )
{
        vector<int> v; 
        list<int> l;

        for (int i=0; i<8; i++)     //往v和l中分別添加元素
        {
                v.push_back(i);
                l.push_back(i);
        }

        cout << "v[2] = " << v[2] << endl;
        //cout << "l[2] = " << l[2] << endl;       //編譯錯誤,list沒有重載[]
        cout << (v.begin() < v.end()) << endl;
        //cout << (l.begin() < l.end()) << endl;   //編譯錯誤,list::iterator沒有重載<或>
        cout << *(v.begin() + 1) << endl;

        vector<int>::iterator itv = v.begin();
        list<int>::iterator itl = l.begin();
        itv = itv + 2;
        //itl = itl + 2;                  //編譯錯誤,list::iterator沒有重載+
        itl++;itl++;                    //list::iterator中重載了++,只能使用++進行迭代訪問。
        cout << *itv << endl;
        cout << *itl << endl;

        return 0;
}

由于vector擁有一段連續的內存空間,能非常好的支持隨機存取,因此vector<int>::iterator支持“+”、“+=”、“<”等操作符。

而list的內存空間可以是不連續,它不支持隨機訪問,因此list<int>::iterator則不支持“+”、“+=”、“<”等操作符運算,因此代碼20、26行會有編譯錯誤。只能使用“++”進行迭代,例如代碼27行,使用兩次itl++來移動itl。還有list也不支持[]運算符,因此代碼18行出現編譯錯誤。

總之,如果需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector;如果需要大量的插入和刪除,而不關心隨即存取,則應使用list。

vector擁有一段連續的內存空間,因此支持隨機存取,如果需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector。

list擁有一段不連續的內存空間,因此支持隨機存取,如果需要大量的插入和刪除,而不關心隨即存取,則應使用list。當大部分插入和刪除發生在序列的頭或尾時可以選擇deque這種數據結構。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区香蕉| 亚洲欧美国产精品| 国产精品网址在线| 午夜精品视频网站| 欧美日韩精品在线| 久久免费在线观看| 国产成人精品久久亚洲高清不卡| 亚洲qvod图片区电影| 亚洲男女性事视频| 精品国内自产拍在线观看| 少妇av一区二区三区| 欧美大片在线影院| 国产精品久久久久久婷婷天堂| 日韩视频免费中文字幕| 国产精品一区二区久久精品| 欧美国产日韩精品| 亚洲毛片在线观看| 亚洲欧美中文另类| 亚洲美女福利视频网站| 亚洲精品自产拍| 久久777国产线看观看精品| 一本一本久久a久久精品牛牛影视| 亚洲欧洲免费视频| 国产精品一区专区欧美日韩| 久久精品夜夜夜夜夜久久| 91日本视频在线| 亚洲bt天天射| 成人性生交大片免费看视频直播| 欧美裸体xxxx极品少妇| 狠狠久久五月精品中文字幕| 亚洲aⅴ日韩av电影在线观看| 色综合久综合久久综合久鬼88| 日韩电影网在线| 国产精品视频久| 国产精品草莓在线免费观看| 国产在线高清精品| 另类视频在线观看| 久久免费视频这里只有精品| 92看片淫黄大片欧美看国产片| 91沈先生在线观看| 亚洲欧美精品一区| 欧美国产激情18| 国产91色在线|| 久久综合久久88| 国产精品海角社区在线观看| 日韩av最新在线观看| 91免费看片网站| 成人免费观看49www在线观看| 性欧美办公室18xxxxhd| 亚洲韩国日本中文字幕| 欧美精品久久一区二区| 91最新在线免费观看| 国产精品激情av在线播放| 国产精品视频自拍| 亚洲国产成人精品一区二区| 色伦专区97中文字幕| 成人网在线观看| 欧美成人免费全部观看天天性色| 国产精品高潮呻吟久久av黑人| 久久精视频免费在线久久完整在线看| 国产成一区二区| 日韩精品免费综合视频在线播放| 中文字幕亚洲第一| 欧美肥臀大乳一区二区免费视频| 欧美黑人性视频| 欧美网站在线观看| 成人免费淫片aa视频免费| 日本亚洲欧美三级| 性欧美长视频免费观看不卡| 久久久久久这里只有精品| 国产精品成人国产乱一区| 亚洲天堂视频在线观看| 亚洲白拍色综合图区| 97精品一区二区视频在线观看| 亚洲最大成人网色| 九色成人免费视频| 久久精品视频播放| 日韩在线视频免费观看高清中文| 欧美高清激情视频| 亚洲天堂网在线观看| 精品国偷自产在线视频99| 97国产精品免费视频| 国产丝袜一区二区三区| 国产一区二区视频在线观看| 欧美极品少妇xxxxx| 国产亚洲精品久久久久动| 日韩精品免费在线观看| 九九热精品视频国产| 亚洲精品欧美一区二区三区| 日本不卡免费高清视频| 日韩福利在线播放| 亚洲成人久久一区| 精品亚洲一区二区三区四区五区| 欧美日韩精品在线视频| 日韩免费精品视频| 亚洲欧美精品suv| 国产视频一区在线| 2019中文字幕在线免费观看| 最近2019年日本中文免费字幕| 亚洲精品97久久| 狠狠色噜噜狠狠狠狠97| 亚洲国产91色在线| 日韩视频欧美视频| 日韩中文字幕欧美| 国产精品人成电影在线观看| 日韩欧美成人网| 国产高清在线不卡| 亚洲伊人久久大香线蕉av| 成人免费网视频| 欧美日韩国产丝袜美女| 日韩av在线导航| 欧美与欧洲交xxxx免费观看| 久久99精品久久久久久青青91| 国产日韩欧美日韩大片| 黄色一区二区在线观看| 久久国产精品视频| 91九色国产视频| 欧美日韩日本国产| 97在线视频免费观看| 91中文字幕一区| 亚洲美女又黄又爽在线观看| 精品亚洲永久免费精品| 在线播放日韩欧美| 在线视频亚洲欧美| 一区二区三区天堂av| 亚洲一区二区三区四区在线播放| 国产在线视频不卡| 91美女福利视频高清| 91爱爱小视频k| 91麻豆国产语对白在线观看| 国产一区二区三区网站| 欧美精品制服第一页| 日韩成人av在线播放| 久久久久久中文字幕| 国产91色在线|免| 精品日韩视频在线观看| 亚洲国产黄色片| 日韩欧美国产黄色| 国产亚洲视频中文字幕视频| 久久久免费高清电视剧观看| 色噜噜久久综合伊人一本| 最近2019年手机中文字幕| 久久夜色精品国产亚洲aⅴ| 日韩av资源在线播放| 欧美色视频日本版| 欧美日本国产在线| 一区二区三区视频观看| 精品国产一区二区三区久久狼黑人| 欧美精品一区二区三区国产精品| 在线播放精品一区二区三区| 日韩av影片在线观看| 欧美精品免费看| 亚洲欧美日韩一区二区在线| 亚洲精品wwwww| 中文字幕成人在线| 日本成人免费在线| 91精品国产沙发| 国产精品视频中文字幕91| 精品呦交小u女在线| 久久亚洲国产精品成人av秋霞| 久久久99免费视频| 国产欧美日韩91| 亚洲美腿欧美激情另类| 2024亚洲男人天堂|