容器即可以包含各種的資料形式的結構類,c++ stl中可以理解為存放其他物件的物件,在c++標準庫中有許多容器型別,包括順序容器和關聯容器,這裡介紹幾種順序容器的基本操作和應用;
1、這裡先介紹標準容器定義的運算子:
這裡a ,b 為容器例項。
2、所有容器的迭代器訪問介面
3、其他的一些通用訪問介面
4、介紹完了一般容器的介面外,這裡再詳細說明順序容器的介面,順序容器一般介面
5、順序容器其他介面,與所支援的容器型別有關
6、迭代器及最大值最小值
各容器都有相應的迭代器iterator,一般用於指向容器中的成員,類似於指標。一般使用a.begin()來獲取容器a的開始迭代器,其指向a中第乙個元素,a.end()來獲取容器a的末尾迭代器,不指向任何資料,迭代器可以通過加減整數值來移動位置,指向容器中的任意元素。
vector:: iterator it; //it可以讀寫vector的元素;
string:: iterator it; //it可以讀寫string中的字元;
vector::const_iterator it; //it只能讀元素,不能寫;
string::const_iterator it; //it只能讀元素,不能寫;
雖然string不是容器,但是這裡也可以使用迭代器,vector,string等可以使用下標進行元素訪問,而有些容器就只能使用迭代器來訪問資料了;
迭代器it指向的資料為(*it)。
在c++中有兩個函式可以獲取容器中一段範圍內的最大值和最小值分別為:iterator max_element(iterator i, iterator j) ;iterator min_element(iterator i, iterator j)定義在檔案algorithm中,返回值也是乙個迭代器,輸入為兩個迭代器邊界[i, j)。
7、向量vector
在c++11中vector可以利用集合數來直接初始化:vector v;此功能只能在vs2012以上中才被完全支援。上面介紹了一些相關的介面操作和函式,這裡先對vector進行相關練習測試:
#include
#include
using
namespace
std;
int main()
; vector
vec1,vec2,vec3; //較少有直接賦值的,與陣列不一樣,int可以是其他基本資料型別,也可以其他自己定義的型別結構
for(int i = 0; i< 6; i++)
vec3 = vec2;//賦值
vec1.insert(vec1.begin()+2,10); //第二個位置插入10
vec1.erase(vec1.begin()+4); //第四個位置刪除
vec2.pop_back(); //末尾數刪除
vec2.push_back(10); //末尾新增10
cout
<< "vec3 size:"
<< vec3.size() << endl;
cout
<< "vec3 max_size:"
<< vec3.max_size() << endl;
cout
<< "vec3 front:"
<< vec3.front() << endl;
cout
<< "vec3 back:"
<< vec3.back() << endl;
cout
<< "\nvec1:" ;
for(int i = 0; i < vec1.size(); i++)
cout
<< " "
<< vec1[i] ;
cout
<< "\nvec2:" ;
for(int i = 0; i < vec2.size(); i++)
cout
<< " "
<< vec2[i] ;
cout
<< "\nvec3:" ;
for(int i = 0; i < vec3.size(); i++)
cout
<< " "
<< vec3[i] ;
return
0;}
測試結果:
8、雙端佇列,與向量差不多,具有相似的方法
#include
#include
using
namespace
std;
int main()
; for(int i = 0; i < 6; i++)
deq1.push_back(a[i]);
deq2 = deq3 = deq1; //賦值
deq1.insert(deq1.begin()+2,10);
deq1.erase(deq1.end()-2);
deq2.pop_back();
deq2.push_back(10);
deq3.pop_front(); //雙向佇列新加
deq3.push_front(10);
cout
<< "\ndeq1:" ;
for(int i = 0; i < deq1.size(); i++)
cout
<< deq1.at(i) << " " ;
cout
<< "\ndeq2:" ;
for(int i = 0; i < deq2.size(); i++)
cout
<< deq2.at(i) << " ";
cout
<< "\ndeq3:" ;
for(int i = 0; i < deq3.size(); i++)
cout
<< deq3[i] << " ";
return
0;}
測試結果:
9、列表,list與前面兩個有點不一樣,不能通過下標訪問元素,其迭代器也不支援數字運算(+ - =),具有remove(),splice()等功能函式;
#include
#include
using
namespace
std;
void display(list
listn) //list輸出函式
else
cout
<< " null list!";
}int main()
; for(int i = 0; i < 6; i++) //不支援下標訪問
list4 = list5 = list6 = list1;
list1.remove(3); //刪除第三個數
list
::iterator it1 = list4.begin();
//list 不支援iterator 的代數運算+ = 等
advance(it1,3); //前進3個
list4.insert(it1,10);
list
::iterator it2 = list5.begin();
advance(it2,3);
list5.splice(it2,list6); //list6連線到list5的it2位置,list6刪除
cout
<
display(list1);
cout
<
display(list2);
cout
<
display(list3);
cout
<
display(list4);
cout
<
display(list5);
cout
<
display(list6);
return
0;}
測試結果:
陣列array也是一種順序容器,array 定義的時候必須定義陣列的元素個數:arraya = ;
array的應用與其他的容器差不多,只不過array不能再新增或刪除元素。
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 單向列表。只支援單...
C 順序容器
一 各個順序容器效能差異主要體現在一下兩個方面 1.在容器中任意位置新增和刪除元素的代價 2.隨機訪問容器中元素的代價 vector list deque forward list array string vector是可變大小陣列,支援快速隨機訪問,在尾部插入和刪除元素較為方便 list是雙向鍊...