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;