STL容器(一)(附件STL幫助手冊)

2021-08-29 22:26:40 字數 4118 閱讀 3068

解決stl編譯警告的方法,在標頭檔案的include**前加上:#pragma warning (disable : 4786)

注:disable 後邊是警告代號。

一串行1)        

vector模板類(標頭檔案為vector,老版本為vector.h)

陣列的一種類表示,可反轉容器,rbegin()和rend()分別指向反轉序列的第乙個和超尾疊待器,型別為reverse_iterator。

1.       使用方法

vector屬於std命名域的,因此需要通過命名限定,如下完成你的**:

using std::vector;

vectorvec;

或者連在一起,使用全名:

std::vectorvints;

2.      

vector的主要方法:

1)       向vector新增乙個資料

vector新增資料的預設方法是push_back()。push_back()函式表示將資料新增到vector的尾部,並按需要來分配記憶體。

2)       訪問vector中的資料

使用兩種方法來訪問vector。

1、vector::at()

2、vector::operator

operator主要是為了與c語言進行相容。它可以像c語言陣列一樣操作。但at()是我們的首選,因為at()進行了邊界檢查,如果訪問超過了vector的範圍,將丟擲乙個例外。由於operator容易造成一些錯誤,所有我們很少用它,下面進行驗證一下:』

vectorv;

v.reserve(10);

for(int i=0; i<7; i++)

v.push_back(i);

try

catch(const exception& e)

3)      刪除vector中的資料

vector能夠非常容易地新增資料,也能很方便地取出資料,同樣vector提供了erase(),pop_back(),clear()來刪除資料,當你刪除資料的時候,你應該知道要刪除尾部的資料,或者是刪除所有資料,還是個別的資料。在考慮刪除等操作之前讓我們靜下來考慮一下在stl中的一些應用。

5.對向量可執行的其他操作(非成員函式)

1.or_each(iterator1,iterator2,function_name);//對向量區間[iterator1,iterator2)中的每個元素執行函式function_name.

2.random_shuffle(itr1,itr2);//隨即排列向量區間[iterator1,iterator2)中的元素。要求容器支援隨即訪問。

3.      對於基本型別,使用sort(itr1,itr2).對向量區間[iterator1,iterator2)排序(公升序)。

對於使用者定義的物件(如結構體),需要定義能夠處理該型別物件的成員或非成員函式,再使用上述函式。

如果想按別的資料域排序,則可用sort(itr1,itr2,function_name);//function_name的返回值必須能轉換成bool型別。

c++將operator++()作為過載++字首版本,operator++(int)作為字尾版本(其中引數永遠都不會用到)。

2)deque(標頭檔案queue,是乙個介面卡類)

deque 和vector一樣都是標準模板庫中的內容,deque 是雙端佇列,在介面上和vector 非常相似,在許多操作的地方可以直接替換。vector在預設情況下是典型的使用序列的方法,對於deque,當使用插入刪除操作的時候是乙個更好的選擇。

1.      細讀上面兩張**,你會發現和vector比較這裡增加了兩個函式。

push_front(elem) —— 在頭部插入乙個資料。

pop_front() —— 刪除頭部資料。

相對於vector 缺少了兩個函式

capacity() —— 返回vector當前的容量。

reserve() —— 給指定大小的vector 分配空間。

deque是大塊大塊地分配記憶體,每次插入固定數量的資料。vector是就近分配記憶體。

2.      當執行大資料量的呼叫push_back()的時候,記住要呼叫vector::reserve()。

deque分配的空間是預先分配好的,deque維持乙個固定增長率,在vector實驗中我們考慮到應該呼叫vecor::reserve()

.然後在下面這個例子驗證了我們的假設,在使用vector的時候呼叫reserve()能夠膀子我們預先分配空間,這將是vector乙個預設選擇的操作。

3.      當你分配很多記憶體單元的時候,記住使用deque**記憶體要比vector消耗時間多。

在實驗三中我們**了vector和deque在**非鄰接記憶體塊上的不同,分別證明了vector在分配記憶體的時候是線性增長,而deque是指數增長,同樣,vector要**的記憶體比deque多的多,如果你迴圈呼叫了push_back(),那麼deque將獲取大量的記憶體,而且是臨近的。我們通過測試發現在分配記憶體單元消耗的時間和vector的時間接近。

4.      如果你計畫使用insert(),或者需要pop_front(),那就使用deque。

5.      對於訪問資料,vector::at()效率最高。

3)      list(標頭檔案list,雙向鍊錶,可反轉容器)

在任一位置的插入和刪除的時間都是固定的,不能隨記訪問。

與失量迭代器不一樣,從容器中插入和刪除元素後,迭代器所指向的元素不變。

常用成員函式:

函式說明

void merge&x>

將都已經排序的鍊錶x合併到呼叫鍊錶中,並且排序,x為空。時間複雜度為線性時間。

void remove(const t & val)

從鍊錶中刪除val的所有例項。線性時間。

void sort()

使用《操作符對列表排序。時間複雜度為:nlogn

void splice(iterator pos, listx)

將鍊錶x的內容插入到pos的前面,x將為空。固定時間。

void unique()

將連續相同的元素壓縮為單個元素。線性時間。

說明:                   splice()

方法執行後,迭代其仍然有效。unique()只能將相鄰的相同值壓縮為單個值。若想每個值佔乙個位置,應先sort()後再呼叫unique().

非成員函式,要求隨即訪問迭代器,所以不能用於鍊錶中。

4)  queue(標頭檔案queue,是乙個介面卡類)

操作:方法

說明bool empty() const

隊列為空,返回true,否則返回false

size_type size() const

返回佇列中元素的數目

t& front()

返回指向隊首元素的引用

t& back()

返回指向隊尾元素的引用

void push(const t& x)

在隊尾插入x

void pop()

刪除隊首元素

5)  priority_queue(標頭檔案queue,預設的底層類是vector)

最大的元素被移到隊首。

使用方法:priority_queuepq1             priority_queue(>)

greater<>()是乙個欲定義的函式物件,確定哪個元素放到隊首的比較方式。

6)  stack(標頭檔案stack,底層類vector,是乙個介面卡類)

基本操作:

方法說明

bool empty() const

如果堆疊為空,則返回true;否則返回false

size_type size() const

返回堆疊中的元素數目

t& top()

返回指向棧頂元素的引用

void pop()

刪除棧頂元素

void push(const t& x)

在堆疊頂部插入x

續:stl容器(2)

STL 容器總結(一)

一 所有容器的共通操作 1 equality 和 inequality 運算子,返回 true 或者 false。2 assignment 運算子,將某個容器複製給另乙個容器。3 empty 會在容器沒有任何元素的時候返回 true,否則 false。4 size 返回目前容器中持有元素的數目。5 ...

STL 淺入 容器 (一)

stl裡的容器按元素在容器內的排序方式,分序列式和關聯式。c 中的array就是乙個序列式容器,其中的元素集合呈線性關係。stl中的序列式容器 等。其中stack和queue在技術上稱之為介面卡,即內部機制採用其他容器實現。1.vector 特徵 類似陣列,但可以空間大小自動隨元素的數量改變。vec...

stl一些容器

deque a deque deque n,elem n個elem初始化的deque deque beg,end 雙指標初始化 v.push front 取出第乙個元素 棧,先進後出。通過top 方法返回棧頂元素,push 壓棧,pop 出棧。效率很高,不能遍歷,不支援隨機訪問。q.front q....