1. 程式人生 > >STL的常見用法(1)

STL的常見用法(1)

1.vector 定義:vector<typename> name;

typename 表示可以是任何基本型別,int, doubel, char, 結構體,也可以是STL標準容器,例如vector, set, queue 等。

例如:vector<vector<int> > name;相當於一個二維陣列只不過這個是變長的。

2.vector 容器內元素的訪問;一般有兩種形式@1:下標訪問,@2:通過迭代器訪問。

迭代器(iterator)可以理解為一種類似指標的東西,定義:vector<typename>::iterator it;可以通過*it來訪問vector裡面的元素。

int main(){
	ios::sync_with_stdio(false);
	vector<int>v;
	for(int i = 1; i <= 5; i++){
		v.push_back(i);
	}
	vector<int>::iterator it = v.begin();
	for(int i = 0; i < 5; i++){
		printf("%d ",*(it + i));
	}
	printf("\n");
	for(int i = 0; i < 5; i++){
		printf("%d ",v[i]);
	}
	printf("\n");
	for(vector<int>::iterator it = v.begin(); it != v.end(); it++){
		printf("%d ", *it);
	}
	return 0;
}

在常用STL容器中,只有在vector和string中,才允許使用v.begin() + 3這種迭代器加上整數的寫法。

int main(){
	ios::sync_with_stdio(false);
	vector<int>v;
	for(int i = 1; i <= 5; i++){
		v.push_back(i);
	}
	v.insert(v.begin() + 2, -1); //用來向vector的任意迭代器it插入一個元素x,時間複雜度o(n) 
	//v.pop_back();//pop_back()用來刪除vector尾元素。size()獲得vector中元素個數 
	//erase()有兩種用法,刪除單元格,刪除一個區間[)的所有元素,時間複雜度為o(n)
	//v.erase(v.begin() + 3); 
	//for(int i = 0;i < v.size(); i ++){
	//	printf("%d ",v[i]);
	//}
	v.erase(v.begin()+1,v.begin()+2);
	for(int i = 0;i < v.size(); i ++){
		printf("%d ",v[i]);
	}
	printf("\n");
	//v.clear();//清空vector中所有元素 
	//printf("%d\n",v.size()); 
	
	return 0;
}

set的常見用法:

set的定義:set<typename> name;定義賀vector的一樣。大部分stl都是這樣定義的。

set元素的訪問;由於除開vector和string之外的stl容器都不支援*(it+i)的訪問形式。

int main(){
	set<int>s;
	s.insert(3);//insert(x)將x插入set容器中,並且自動排序和去重時間複雜度o(logn) 
	s.insert(5);
	s.insert(2);
	s.insert(3);
	s.insert(6);
	s.insert(7);
	for(set<int> :: iterator it = s.begin(); it != s.end(); it++){
		printf("%d ",*it);
	}
	printf("\n");
	//find()函式返回set中對應為value的迭代器,時間複雜度為olog(n) 
	printf("%d\n",*(s.find(5)));
	//erase()函式有兩種用法:刪除單個元素,刪除一個區間內的所有元素;
	//刪除單個元素有兩種方法刪除迭代器,或者直接刪除value. 
	//s.erase(s.find(2)); 
	//s.erase(2);
	//區間刪除[);
	//size()返回set內元素的個數。時間複雜度o(1) 
	printf("%d\n",s.size()); 
	s.erase(s.find(3),s.end()); 
	for(set<int> :: iterator it = s.begin(); it != s.end(); it++){
		printf("%d ",*it);
	}
	printf("\n");
	//clear()清空set的所有元素時間複雜度o(n)
	s.clear();
	printf("%d\n",s.size());	
	return 0;
}

使用find函式要判斷元素是否存在只是要使用迭代器:

set<int>s;
	for(int i = 1; i <= 5; i++)s.insert(i);
	set<int>::iterator iter;
	iter = s.find(5);
	if(iter!=s.end()){
		cout << *(s.find(5)) << endl;
	}else{
		cout << "no thanks" << endl;
	}

set中元素是唯一的,如果需要處理不唯一的情況,則可以使用multiset。另外還增加了unordered_set,以散列表代替set內部的紅黑數。可以用來處理只去重不排序的需求,速度比set快的多。

string的常見用法:

string的定義:string str;

int main(){
	string str, str2, str3;
	//如果要讀入和輸出整個字串,則只能用cin和cout;
	//可以使用c_str()來用printf()輸出字串,把字串轉化為字元陣列; 
	//cin >> str;
	//printf("%s\n",str.c_str()); 
	//string可以使用+法可以直接比較大小。 
	//length()//size()返回字串的長度 
	//insert()時間複雜度o(n)
	//insert(pos, string);在Pos號位置插入字串string 
	//insert(it, it2, it3); it為原字串,it2,it3為待插字串的首尾迭代器用來表示[it2, it3)將被插入在it位置上 
	//cin >> str2 ;
	//str3 = str2 + str;
	//cout << str3 << endl; 
	//str3.insert(3,str2);
	//cout << str3 << endl;
	//cout << str3.length() << " " << str3.size() << endl;
	//str = "wefgy";
	//str2 = "fguy";
	//erase()函式刪除單個元素,刪除一個區間內的所有元素。時間複雜度均為o(n).
	
	//cin >> str >> str2;
	//str2.insert(str2.begin()+3,str.begin(),str.end());
	//cout << str2 << endl;
	
	cin >> str;
	//str.erase(str.begin()+2);
	//cout << str << endl;
	//刪除一個區間內的所有元素[first, last) 
	//str.erase(str.begin()+2, str.end()-1);//迭代器法
	str.erase(3,2);//刪除從第三個元素開始的兩個字元;
	//clear()函式用以清空string中的資料,時間複雜度o(1)
	str.clear();
	//substr()函式substr(pos,len)返回從POS位置開始,長度為len的子串時間複雜度為o(len) 
	
	//cout << str.length() << endl; 
	//cout << str << endl;
 	str2 = "Thank you for your smile";
 	cout << str2.substr(0,5) << endl;
 	
	 
	return 0;
}

在這裡主要說明find()函式和string::npos的使用;

int main(){
	//string str = "Thank you for your smile";
	//string str2 = "you";
	//string str3 = "me";
	//string::npos
 	//string::npos是一個常數,其本身的值為-1,但是由於是unsigned_int型別,因此實際上也可以認為是unsigned_int型別的最大值。
	//string::npos用以作為find函式失配時的返回值。主要結合find()函式來使用;
	//find(str2)函式返回其在str中第一次出現的位置如果不存在str2返回string::npos; 
	//find(str2, pos)從str的pos號位開始匹配str2,返回值與上相同 
	//if(str.find(str2) != string::npos){
	//	cout << str.find(str2) << endl;
	//}
	//if(str.find(str2,7) != string::npos){
	//	cout << str.find(str2, 7) << endl;
	//} 
	//replace()
	//replace(pos,len,str2)把str從pos位置開始。長度為len的子串替換為str2.
	//replace(it1,it2,str2)把str的迭代器[it1,it2)範圍的子串替換為str2;時間複雜度為o(str.length()) 
	string str = "Maybe you will turn around";
	string str2= "will not";
	string str3 = "surely";
	cout << str.replace(10, 4, str2) << endl;
	cout << str.replace(str.begin(),str.begin()+5,str3) << endl;
	return 0; 
}