C++ 常用到的數據結構的使用 STL

1 string

頭文件 : #include <string>

使用

#include <iostream>
#include <string>
using namespace std;

int main()
{
	string a = "abcdf";
	int k = a.find('r');  //尋找r在字符串中第一次出現的位置,從0開始,不存在返回-1;
	cout << k << endl;
	a.substr(1,3);      //返回從字符的第一位開始,往後3位的字符串;
	a.substr(3);         //返回從字符的第三位開始的字符串;
	
	string b = a+"abc";//拼接兩個字符串 
	cout<<b<<endl;
	return 0;
}

2 vector

vector是一個變長數組,在平時的使用的會常常用到,當我們常常需要在一個數組後頻繁插入和刪除一個元素時,就可以考慮使用vector

頭文件 : #include < vector >
定義 : vector< typename > vec; //typename可以是任意的數據結構

使用

vector<int> vec(5);     //聲明一個vector,併爲其賦予5的內存空間
vector<int> vec(5,1);   //賦予5的內存空間,並把初值都設爲1;
vec = vector<int>(5,1); //重新初始化vec的值;
vec.size();             //返回vector的長度,複雜度爲O(1);
vec.clear();            //清空vector的內容,並將內存釋放;
vec.push_back(x);       //在vector後插入x,插入和刪除操作使用均攤複雜度來算,複雜度爲O(1),使用時方便且複雜度低,相當推薦;
vec.pop_back();         //刪除vector最後一個元素,複雜度爲O(1);
vec.begin();            //返回vector的起始地址;
vec.end();              //返回vector的終止地址;
sort( vec.begin(),vec.end() );      //對vector排序;
vec.erase( vec.begin() );           //刪除vec的首地址的元素,注意傳入的一定要是一個地址,複雜度O(n),不建議使用

//遍歷
for( int i = 0 ; i < vec.size() ; i++ )
{
	cout << a[i] << endl;
}
或者:
vector<int>:: iterator it;
for( it = vec.begin() ; it != vec.end() ; it++ )
{
	cout << *it << endl;
}

 

3 set

set是一個集合,它當中沒有重複的元素,並按照順序排列好
使用場景 : set一般用於查找問題中的查找有無,即給定一個元素判斷這個元素是否存在於這個數組中。還可以用來刪除數組中特定的數
頭文件 : #include < set >
定義 : set< typename > s //這裏的typename可以是任何一種數據類型
使用

s.insert(x); //插入一個元素,複雜度爲log(n) 
s.erase(x);  //刪除一個元素,複雜度爲log(n)   在遍歷時刪除的話,先用一個變量存當前的值,先讓迭代器++,再刪除
s.size();    //返回當前set中的大小 
s.empty();   //判斷set是否爲空,爲空返回true 
s.begin() ;  //返回set第一個元素的迭代器,注意不是數值 
s.end();     //返回set最後一個元素下一位置的迭代器 
s.find(x);    //返回x在set中的迭代器,若不存在則返回s.end()
if(s.find(x)!=record.end())  //x存在與s中
{}
set<int> record(nums1.begin(),nums1.end());//使用vector創建set
tmp.insert(make_pair(s[i],t[i])); //在set中插入鍵值對

//遍歷
set<int>::iterator it;   //定義迭代器
for(it=s.begin();it!=s.end();it++)
{
	cout << *it << " ";    //注意是迭代器,需要加上*纔可以輸出值
}

 

4 Map

Map,我們一般稱爲字典或是映射,它提供了一對一的映射關係
使用場景 : map用於查找問題中某個元素出現的次數,比如問‘a’這個元素在數組中出現了多少次。這個只是最基本的應用場景,由於可以有任意的鍵值對的對應,map的應用遠不止於此
頭文件 : #include < map >
定義 : map< typename,typename > ma ,這裏的typename可以是任何一種的數據類型
使用
c++中map的初始值自動爲0

ma.clear();  //清除map中的所有元素
ma[5]=1;     //讓5對應的值設爲1,注意複雜度是log(n)
ma[6]++;     //讓6對應的值加1,log(n)
ma.erase(6); //把6這個鍵從映射中刪去,log(n)
ma.find(6);   //查找6在map是否存在,如果不存在返回ma.end();log(n)
//map的遍歷
map<int,int> ma;
map<int,int>::iterator it;
for (it = ma.begin(); it != ma.end(); it++)
{
	cout << it->first << ' ' << it->second << '\n';    //迭代器是一個二元對
}

5 stack與queue

棧這種數據結構的特點是先進後出

頭文件 : #include < stack>
定義 : stack< typename> s,這裏的typename可以是任何一種的數據類型
使用

stack<int> s;
s.empty();//是否爲空
int top=s.top();//獲取棧頭數據
stack.pop();//出棧
stack.push(1);//入棧

queue的用法和棧是一樣的,唯一不同的是,隊列的先進先出

6 priority_queue

優先隊列本質上就是一個最大堆或者最小堆,最大堆就是優先級最大的那個數在堆頂,最小堆就是優先級最小的在堆頂,這裏的優先級指的是數值的大小,也可以通過自己重載<號來重新定義比較方式

頭文件 : #include < queue >
定義 : priority_queue < typename > q;
這裏的typename可以是任意的數據型:int,double,string,char,還可以是自己寫的結構體
使用:

q.push(x)  //插入一個元素,複雜度log(n)
q.top()    //訪問堆頂元素
q.pop()    //把堆頂元素出隊,複雜度log(n)
q.empty()  //若q爲空,返回true,否則返回false
q.size()   //返回q長度

定義最大堆與最小堆

priority_queue<int> q;    //默認的最大堆,優先級最大的在隊首
//priority_queue< int,vector<int>,greater<int> >   //定義最小堆,優先級小的在隊首

使用結構體定義最大堆與最小堆

定義方式不變,在結構體裏重載<運算符

struct Node{
	int x,y;
	bool operator <(const Node &n) const
	{
		return x<n.x;     //根據x的值來定義優先級,最大堆
		//return x>n.x;   //最小堆
	}
};

priority_queue<Node> q;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章