程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 容器簡介 and Vector

容器簡介 and Vector

編輯:關於C++

容器簡介 and Vector。本站提示廣大學習愛好者:(容器簡介 and Vector)文章只能為提供參考,不一定能成為您想要的結果。以下是容器簡介 and Vector正文


[TOC]

6.1 容器的共通才能和共通操作 1. 共通才能
1. 一切容器提供都是“value語意”而非“reference語意”。容器停止元素的安插操作時,外部施行的是copy操作,置於容器內。因而STL容器的每一個元素都必需可以被拷貝。
2. 一切元素構成一個次第。
3. 各項操作並非相對平安。
2.共通操作
  • 初始化,每個容器類別都提供一個default結構函數,一個copy結構函數和一個析構函數。

    ContType c              //發生一個未含任何元素的空容器
    ContType c1(c2)         //發生一個同型容器
    ContType c(beg, end)    //復制[beg,end]區間內的元素,作為容器初值
    c.~ContType()           //刪除一切元素,釋放內存
    c.size()                //前往容器中的元素數量
    c.empty()               //判別容器能否為空
    c.max_size()            //前往元素的最大能夠數量
    c1 == c2
    c1 != c2
    c1 < c2
    c1 > c2
    c1 <= c2
    c1 >= c2
    c1.swap(c2)             //交流c1和c2的數據
    swap(c1, c2)            //同上,是個全局函數
    c.begin()
    c.end()
    c.rbegin()
    c.rend()
    c.insert(pos, elem)
    c.erase(beg, end)
    c.clear()
    c.get_allocator()       //前往容器的內存模型
  • 與大小相關的操作函數。size()empty()max_size()
  • 比擬,比擬依照以下三條規則:
    ```
  1. 比擬操作兩端必需屬於同一型別。
  2. 假如兩個容器的一切元素依序相等,那麼兩個容器相等。采用==操作。
  3. 采用字典式順序比擬准繩來判別某個容器能否小於另一個容器。
    ```
  • 賦值和swap

    當你對著容器復制元素時,源容器的一切元素被拷貝到目的容器內,後者原來的一切元素全被移除。所以,容器的賦值操作代價比擬昂揚。
    假如兩個容器型別相反,而且拷貝後源容器不再被運用,那麼我們可以運用一個復雜優化的辦法:swap。現實上它只交流某些外部指針。
6.2 Vector

運用vector之前,必需包括#include <vector>。其中,vector聲明在std。

namespace std {
    template <class T,
                class Allocator = allocator<T>>
            class vector;
}
1.vector的才能

大小和容量。vector優良功能的秘訣之一,就是配置比其所包容的元素所需求更多的內存。
vector之中用於操作大小的函數有size、empty、max_size。另一個與大小有關的函數是capacity,它前往vector實踐可以包容的元素數量。假如超越這個數量,vector就有必要重新分配外部貯存器。

vector的容量之所以很重要,有以下兩個緣由:

  1. 一旦內存重新配置,和vector元素相關的一切ref,pointer,iterator都會生效。
  2. 內存重新配置很耗時間。

你可以運用reserve()保存適當容量,防止一再重新配置內存。另一種防止重新配置內存的辦法是,初始化時期就向結構函數傳遞附加參數,結構出足夠的空間。為了獲取這種才能,必需提供一個default結構函數。假如型別復雜,就算提供了default結構函數,初始化操作也很耗時,假如你只不過為了保存足夠的內存,那倒不如運用reserve。

安插操作能夠使ref、pointer、iterator生效。由於能夠招致重新配置空間。

上面有個直接所見vector容量的小訣竅。

std::vector<T>(v).swap(v)

swap後,ref等都會生效。

2. Vector的操作函數

結構、拷貝和析構

vector<Elem> c
vector<Elem> c1(c2)
vector<Elem> c(n)
vector<Elem> c(n, elem)     //發生一個大小為n的vector,每個元素都是elem
vector<Elem> c(beg, end)
c.~vector<Elem>()

非變化性操作

c.size()
c.empty()
c.max_size()
capacity()
reserve()
c1 == c2
c1 != c2
c1 < c2
c1 > c2
c1 <= c2
c1 >= c2

賦值

c1 = c2
c.assign(n, elem)
c.assign(beg, end)
c1.swap(c2)
swap(c1, c2)

元素存取,不作邊界反省。

c.at(idx)
c[idx]
c.front()
c.back()

迭代器相關函數

c.begin()
c.end()
c.rbegin()
c.rend()

安插和移除元素

c.insert(pos, elem)
c.insert(pos, n, elem)
c.insert(pos, beg, end)
c.push_back()
c.erase(pos)
c.erase(beg, end)
c.resize(num)
c.resize(num ,elem)
c.clear()

vector並未提供任何函數可以直接移除“與某值相等”的一切元素,以下可以移除一切val:

col1.erase(remove(col1.begin(), col1.end(), val),
            col1.end());
3. 異常處置

假如vector調用的函數拋出異常,C++規范順序庫做出如下保證:

  1. 假如push_back()安插元素時發作異常,該函數不起作用。
  2. 假如元素的拷貝(copy, assign)操作不拋出異常,insert要麼成功,要麼什麼都不發作。
  3. pop_back()決不會拋出任何異常。
  4. 假如元素拷貝操作不拋出異常,erase和clear就不拋出異常。
  5. swap不拋出異常。
  6. 假如元素拷貝操作相對不會拋出異常,那麼一切操作不是成功,就是不起作用。這類元素可被稱為POS(plain old data)。POD泛指那些無C++特性的異常,例如C structure。

一切這些保證都基於一個條件:析構函數不得拋出異常。

4. Class vector<bool>

目的是獲取一個優化的vector,其耗用空間遠遠小於普通vector生成的bool vector。

假如你需求靜態大小的bitfield,該當運用bitset。

vector<bool>的特殊操作

c.flip()
m[idx].flip()
m[idx] = val
m[idx1] = m[idx2]

參考:

  1. C++規范順序庫:自修教程與參考手冊
    
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved