【C++ STL學習之一】容器的共通能力和共通操作總結

來源:互聯網
上載者:User

一、C++ STL各容器有一些共通的能力

其中三個最核心的能力是:

(1)所有容器提供的是“value語意”而不是“reference語意”。

容器進行元素的安插操作時,內部實施的是拷貝操作,存放的是元素的副本。因此容器的每一個元素必須能被拷貝

如果打算存放的對象不具備public 拷貝建構函式或者你要得不是對象的副本,那麼容器元素只能是指標

(2)所有元素形成一個次序。

我們可以以相同順序一次或者多次遍曆每個元素。每個容器都提供可返回迭代器的函數,運用這些迭代器可以遍曆元素。

(3)一般來說,各項操作並非絕對安全。

調用者必須確保傳給操作函數的參數符合需求。違反需求的會導致未定義的行為。而且STL通常不會自己跑出異常。


二、容器的共通操作

下表列出容器的共通操作函數:


(1)初始化

每個容器類別都提供了一個預設建構函式、一個拷貝建構函式和一個解構函式。

以另一個容器的元素為初值,進行初始化:

list<int> intList;
vector<float> floatVec(intList.begin(),intList.end());

以一個數組的元素為初值進行初始化:

int array[] = {1,2,3,4,5};
set<int> intSet(array,array + sizeof(array) / sizeof(array[0]));

從標準輸入擷取元素進行初始化:

deque<int> c((istream_iterator<int>(cin)),
(istream_iterator<int>()));

注意:不能遺漏了初始化參數的那對多餘的括弧:
不能是這樣的:
deque<int> c(istream_iterator<int>(cin),
istream_iterator<int>());

否則,運算式被認為是一個函數c的聲明。它的一個參數的型別是istream_iterator<int>,參數名是cin。第二個參數無名,型別是istream_iterator<int>。函數的傳回值型別是istream_iterator<int>。
但是,我們通過加上一對括弧,就可以使參數istream_iterator<int>(cin)不再符合聲明文法。

因為C++標準中的文法不接受這樣的函式宣告形式:

T name((U), (V));

(2)與大小相關的操作函數

1、size()

返回當前元素的數量

2、empty()

等價於size() == 0.但是其效率可能會高些。所以應該盡量使用empty()。

3、max_size()

返回容器所能容納的最大元素數量。其值會因實作版本不同而不同。

(3)比較

包括常用的==,!=,<,<=,>,>=。

注意:比較操作的兩端即兩個容器必須屬於同一型別。如果容器的所有元素依次序相等,則兩個容器相等。採用operator==檢查元素是否相等。採用字典式書序比較原則來判斷某個容器是否小於另一個容器。

(4)賦值和swap交換

當對容器賦值元素時,源容器的所有元素被拷貝到目標容器內,後者的所有元素完全被移除。所以,賦值操作代價較高。

如果兩個容器的型別相同,而且拷貝後源容器不在使用,可以使用swap進行最佳化。它的效能要優異很多。事實上它只交換某些內部指標,所以時間複雜度是常數,而賦值操作的複雜度是線性。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.