1. 程式人生 > >C++ STL 容器(2)

C++ STL 容器(2)

一 STL的string
1 概念:
(1)string是STL的字串型別,通常用來表示字串.
(2)string和char*的比較:(a)string是一個類, char*是一個指向字元的指標。(b)string不用考慮記憶體釋放和越界。(c)string提供了一系列的字串操作函式(這個等下會詳講)查詢find,拷貝copy,刪除erase,替換replace,插入insert

2 string的存取字元操作
string類的字元操作:
const char &operator[] (int n) const;
const char &at(int n) const;
char &operator[] (int n);
char &at(int n);

3 字元指標和字串的轉換
string s1 = “aaabbbb”; //這就是char* 轉成string
const char *c_str() const; //返回一個以’\0’結尾的字串的首地址

4 string的長度
int length() const; //返回當前字串的長度。長度不包括字串結尾的’\0’。
bool empty() const; //當前字串是否為

5 string字串連線
string &operator+=(const string &s); //把字串s連線到當前字串結尾
string &operator+=(const char *s);//把字串s連線到當前字串結尾
string &append(const char *s); //把字串s連線到當前字串結尾
string &append(const char *s,int n); //把字串s的前n個字元連線到當前字串結尾
string &append(const string &s); //同operator+=()
string &append(const string &s,int pos, int n);//把字串s中從pos開始的n個字元連線到當前字串結尾
string &append(int n, char c); //在當前字串結尾新增n個字元c

6 string的查詢和替換
(1)查詢
find函式如果查詢不到,就返回-1
int find(char c,int pos=0) const; //從pos開始查詢字元c在當前字串的位置
int find(const char *s, int pos=0) const; //從pos開始查詢字串s在當前字串的位置
int find(const string &s, int pos=0) const;//從pos開始查詢字串s在當前字串中的位置
rfind是反向查詢的意思,如果查詢不到,返回-1
int rfind(char c, int pos=npos) const; //從pos開始從後向前查詢字元c在當前字串中的位置
int rfind(const char *s, int pos=npos) const;
int rfind(const string &s, int pos=npos) const;//rfind是反向查詢的意思,如果查詢不到,返回-1
(2)替換
string &replace(int pos, int n, const char *s);//刪除從pos開始的n個字元,然後在pos處插入串s
string &replace(int pos, int n, const string &s); //刪除從pos開始的n個字元,然後在pos處插入串s
void swap(string &s2); //交換當前字串與s2的值

7 string的比較
int compare(const string &s) const; //與字串s比較
int compare(const char *s) const; //與字串s比較
compare函式在>時返回 1,<時返回 -1,==時返回 0。比較區分大小寫,比較時參考字典順序,排越前面的越小。大寫的A比小寫的a小。

8 String的區間刪除和插入
(1)刪除
string &erase(int pos=0, int n=npos); //刪除pos開始的n個字元,返回修改後的字串
(2)插入
string &insert(int pos, const char *s);
string &insert(int pos, const string &s);
//前兩個函式在pos位置插入字串s
string &insert(int pos, int n, char c); //在pos位置插入n個字元c

二Vector容器
1簡介
vector是將元素置於一個動態陣列中加以管理的容器。vector可以隨機存取元素(支援索引值直接存取,用[]操作符或at()方法,這個等下會詳講)。vector尾部新增或移除元素非常快速。但是在中部或頭部插入元素或移除元素比較費時

2vector物件的預設構造
vector採用模板類實現,vector物件的預設構造形式
vector vecT;

vector<int> v1;
cout << "length:" << v1.size() <<endl;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
cout << "length:" << v1.size() <<endl;//長度

3 vector物件的帶引數構造
vector(beg,end); //建構函式將[beg, end)區間中的元素拷貝給本身。注意該區間是左閉右開的區間。
vector(n,elem); //建構函式將n個elem拷貝給本身。
vector(const vector &vec); //拷貝建構函式

void main()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v1.push_back(7);
vector<int> v2 = v1;  //物件初始化
vector<int> v3(v1.begin(), v1.begin()+2 );
}

4 vector的賦值
vector.assign(beg,end); //將[beg, end)區間中的資料拷貝賦值給本身。注意該區間是左閉右開的區間。
vector.assign(n,elem); //將n個elem拷貝賦值給本身。
vector& operator=(const vector &vec); //過載等號操作符
vector.swap(vec); // 將vec與本身的元素互換。

vector<int> vecIntA,vecIntB,vecIntC,vecIntD; 
int  iArray[] = {0,1,2,3,4}; 
vecIntA.assign(iArray,iArray+5);
vecIntB.assign( vecIntA.begin(),  vecIntA.end() );    //用其它容器的迭代器作引數。 
vecIntC.assign(3,9);  
vector<int> vecIntD; 
vecIntD = vecIntA;  
vecIntA.swap(vecIntD); 

5 vector的存取
(1) 通過陣列的方式

void printV(vector<int> &v)
{
	for (int i=0; i<v.size(); i++)
	{
		cout << v[i] << " ";
	}
}

(2)通過迭代器的方式

//正向遍歷
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it ++ )
{
	cout << *it << " ";
}
//逆序遍歷
for (vector<int>::reverse_iterator rit = v1.rbegin(); rit!=v1.rend(); rit++ )
{
	cout << *rit << " ";
}

(3)首尾

int iF = vector.front();	//iF==1
int iB = vector.back();	//iB==9

6 vector的大小

vector.size(); //返回容器中元素的個數
vector.empty(); //判斷容器是否為空
vector.resize(num); //重新指定容器的長度為num,若容器變長,則以預設值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。
vector.resize(num, elem); //重新指定容器的長度為num,若容器變長,則以elem值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。

7 vector的遍歷

vector<int>  vecInt; //假設包含1,3,5,7,9元素 
正向遍歷: 
for(vector<int>::iterator it=vecInt.begin(); it!=vecInt.end(); ++it) 
{ 
  int iItem = *it; 
  cout << iItem;    //或直接使用  cout << *it; 
} 

這樣子便打印出1 3 5 7 9

逆向遍歷: 
for(vector<int>::reverse_iterator rit=vecInt.rbegin(); rit!=vecInt.rend(); ++rit)    //注意,小括	號內仍是++rit 
{ 
               int iItem  = *rit; 
  cout << iItem;      //或直接使用cout << *rit; 
} 

此時將打印出9,7,5,3,1

8 vector的刪除
vector.clear(); //移除容器的所有資料
vec.erase(beg,end); //刪除[beg,end)區間的資料,返回下一個資料的位置。
vec.erase(pos); //刪除pos位置的資料,返回下一個資料的位置。

//區間刪除
v1.erase(v1.begin(), v1.begin()+3);
//根據元素的位置 指定位置刪除
v1.erase(v1.begin()); //在頭部刪除一個元素
//迭代器刪除
for (vector<int>::iterator it =v1.begin(); it != v1.end();)//此處不用再寫it++
{
	if (*it == 2)
	{
		it =v1.erase(it);  
	//當 刪除迭代器所指向的元素的時候,erase刪除函式會讓it自動下移動
	}
	else
	{
		it ++;
	}
}

9vector的插入
vector.insert(pos,elem); //在pos位置插入一個elem元素的拷貝,返回新資料的位置。
vector.insert(pos,n,elem); //在pos位置插入n個elem資料,無返回值。
vector.insert(pos,beg,end); //在pos位置插入[beg,end)區間的資料,無返回值

     vector<int> vecA; 
     vector<int> vecB; 
     vecA.push_back(1); 
     vecA.push_back(3); 
     vecA.push_back(5); 
     vecA.push_back(7); 
     vecA.push_back(9); 

     vecB.push_back(2); 
     vecB.push_back(4); 
     vecB.push_back(6); 
     vecB.push_back(8); 
vecA.insert(vecA.begin(), 11);// 開始位置插入11 {11, 1, 3, 5, 7, 9} 
vecA.insert(vecA.begin()+1,2,33); // 第二位置插入兩個33{11,33,33,1,3,5,7,9} 

//在開始位置插入B的值{2,4,6,8,11,33,33,1,3,5,7,9} 
vecA.insert(vecA.begin() , vecB.begin() , vecB.end() );   

三Deque容器
1 簡介
標頭檔案#include <deque>
deque是“double-ended queue”的縮寫,和vector一樣都是STL的容器,deque是雙端陣列,而vector是單端的。
deque在介面上和vector非常相似,在許多操作的地方可以直接替換。
deque可以隨機存取元素(支援索引值直接存取,用[]操作符或at()方法,這個等下會詳講)。

2 deque的新增和刪除
deque.push_back(elem); //在容器尾部新增一個數據
deque.push_front(elem);//在容器頭部插入一個數據
deque.pop_back(); //刪除容器最後一個數據
deque.pop_front(); //刪除容器第一個資料

3 求deque中某個值在陣列中的下標

 //查詢 -33 在陣列下標的值
deque<int>::iterator it =  find(d1.begin(), d1.end(), -33 );
if (it != d1.end())
{
	cout << "-33陣列下標是" << distance(d1.begin(), it) <<endl;
}
else
{
	cout << "沒有找到值為-33的元素" << endl;
}

4 deque的資料存取

deque.at(idx); //返回索引idx所指的資料,如果idx越界,丟擲out_of_range。
deque[idx]; //返回索引idx所指的資料,如果idx越界,不丟擲異常,直接出錯。
deque.front(); //返回第一個資料。
deque.back(); //返回最後一個數據

5 deque與迭代器
² deque.begin(); //返回容器中第一個元素的迭代器。
² deque.end(); //返回容器中最後一個元素之後的迭代器。
² deque.rbegin(); //返回容器中倒數第一個元素的迭代器。
² deque.rend(); //返回容器中倒數最後一個元素之後的迭代器。

6 deque的大小
deque.size(); //返回容器中元素的個數
deque.empty(); //判斷容器是否為空
deque.resize(num); //重新指定容器的長度為num,若容器變長,則以預設值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。
deque.resize(num, elem); //重新指定容器的長度為num,若容器變長,則以elem值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。

7 deque的插入和刪除(用法與vector一樣)

四stack容器
1 簡介
#include <stack>
stack是堆疊容器,是一種“先進後出”的容器。
stack是簡單地裝飾deque容器而成為另外的一種容器。

2 stack物件的預設構造
stack採用模板類實現, stack物件的預設構造形式: stack stkT;

stack <int> stkInt;            //一個存放int的stack容器。 	
stack <float> stkFloat;     //一個存放float的stack容器。 
stack <string> stkString;     //一個存放string的stack容器。 

3 stack的push()與pop()方法
stack.push(elem); //往棧頭新增元素
stack.pop(); //從棧頭移除第一個元素

stack<int> stkInt;           
stkInt.push(1);
stkInt.push(3);
stkInt.pop();   
stkInt.push(5);
stkInt.push(7);  
stkInt.push(9);
stkInt.pop();          
stkInt.pop();  
此時stkInt存放的元素是1,5  

4 stack物件的拷貝構造與賦值
stack(const stack &stk); //拷貝建構函式
stack& operator=(const stack &stk); //過載等號操作符

               stack<int> stkIntA; 
               stkIntA.push(1); 
               stkIntA.push(3); 
               stkIntA.push(5); 
               stkIntA.push(7); 
               stkIntA.push(9); 
               stack<int> stkIntB(stkIntA);   //拷貝構造 
               stack<int> stkIntC; 
               stkIntC = stkIntA;             //賦值 

5 stack的資料存取
stack.top(); //返回最後一個壓入棧元素

              	 stack<int> stkIntA; 
               stkIntA.push(1); 
               stkIntA.push(3); 
               stkIntA.push(5); 
               stkIntA.push(7); 
               stkIntA.push(9); 
                int iTop = stkIntA.top();             //9 
               stkIntA.top() = 19;                      //19 

6 stack的大小
stack.empty(); //判斷堆疊是否為空
stack.size(); //返回堆疊的大小

               	stack<int> stkIntA; 
               stkIntA.push(1); 
               stkIntA.push(3); 
               stkIntA.push(5); 
               stkIntA.push(7); 
               stkIntA.push(9); 

               if (!stkIntA.empty()) 
               { 
                        int iSize = stkIntA.size();           //5 
               }