生活随笔
收集整理的這篇文章主要介紹了
【2019暑假刷题笔记-STL绪论】总结自《算法笔记》
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目? ? ?錄
一、vector的常見(jiàn)用法
二、set的常見(jiàn)用法?
三、string的常見(jiàn)用法
四、map的常見(jiàn)用法
一、vector的常見(jiàn)用法
vector是一種可變長(zhǎng)數(shù)組,常用于使用vector通過(guò)鄰接表存儲(chǔ)圖;它本身也可以當(dāng)作數(shù)組使用,在一些元素不確定的時(shí)候可以很好的節(jié)省空間。?
vector<vector<int> > a;
a.resize(m);//行數(shù)為m
for(int i=0;i<m;i++)//每行列數(shù)為na[i].resize(n);
//之后可采用遍歷的方式為a數(shù)組賦值
int t;
for(int i=0;i<m;i++)
{for(int j=0;j<n;j++)a[i][j]=t;
}/*也可以這樣*/
vector<int> a[100];//可以理解為100行,行中的元素自己push_back();a[i].push_back(x);
?
vector的定義:vector<typename> name? ||? ex. vector<int> name。二維數(shù)組表示vector內(nèi)元素的訪問(wèn):(1) 通過(guò)下標(biāo)訪問(wèn),ex. vi[index];(2) 使用迭代器訪問(wèn) /*
迭代器的定義:vector<int>::iterator it
迭代器迭代數(shù)組開(kāi)始標(biāo)志:it.begin()+i 其效果和vi[i]一致
迭代器迭代數(shù)組結(jié)束標(biāo)志:it.end() 其指的是數(shù)組最后一個(gè)元素后面的那個(gè),不存在任何元素
begin()和end()是左閉右開(kāi)的思考來(lái)做的
一般來(lái)說(shuō)使用迭代器做循環(huán)是
for(vector<int>::iterator it=vi.begin();it!=vi.end;i++)printf("%d",*(it+i)) 只有vector和string容器可以這么做,其他只能用*it(在循環(huán)條件中it++)
*/
?
?push_back()函數(shù):
/*
使用方式:
vi.push_back(x);
把x的值放在vector類型數(shù)組vi數(shù)組最后面
*/ ?
pop.back()函數(shù):
/*
使用方式:
vi.pop_back(x);
可以刪除vector的尾元素x
*/ ?
size()函數(shù):?
/*
使用方式:
vi.size();
獲得vector中元素的個(gè)數(shù)
*/ ?
clear()函數(shù):
/*
使用方法:
vi.clear();
將vi數(shù)組清空
*/ ?
?insert()函數(shù):
/*
使用方法:
vi.insert(it,x);
例如:
vi.insert(vi.begin()+2,-1);
把-1插到vector數(shù)組的第2個(gè)位置,其后面所有數(shù)字后移一位
*/ ?
erase()函數(shù):
? /*
兩種使用辦法(1)vi.erase(it);刪除單個(gè)元素,例如vi.erase(it.begin()+3);刪除vi中第4個(gè)元素,同時(shí)后面的元素向前移動(dòng)一位。(2)vi.erase(vi.begin()+1,vi.begin()+4);刪除選定區(qū)間中的所有元素,ex.中為刪除vi[1],vi[2],vi[3],左閉右開(kāi)思想。后面的元素向前移3位*/ ?
二、set的常見(jiàn)用法?
set是一種內(nèi)部自動(dòng)升序排列且不含重復(fù)元素的容器,也就是一個(gè)有序的集合。適用于要求去重且不方便開(kāi)數(shù)組的情況。
set的定義:set<typename> nameset內(nèi)元素的訪問(wèn): /*
和vector一樣的是,set容器的迭代定義依舊是set<typename>::iterator it
不同的是:不能使用*(it+i)了
*/
for(set<int>::iterator it=st.begin();it!=st.end();it++)printf("%d",*it); ?
insert()函數(shù): st.insert(x);//將x插入st中 ?
find()函數(shù): set<int>::iterator it=st.find(x) //在st中尋找一個(gè)x元素 ?
erase()函數(shù): /*
刪除單個(gè)元素的形式
1 st.erase(x); //刪除元素x
2 st.erase(st.find(x)) //刪除元素x刪除一個(gè)區(qū)間的所有元素
1 st.erase(first,last)
2 st.erase(it,st.end());
*/ ?
size()函數(shù): st.size();//得到st的元素個(gè)數(shù)
?
clear()函數(shù): st.clear();//清除set所有元素 ?
三、string的常見(jiàn)用法
string用來(lái)存儲(chǔ)字符串,存儲(chǔ)的字符串也可以通過(guò)c_str()函數(shù)轉(zhuǎn)化為字符數(shù)組,如
string str="abcd";
printf("%s\n",str.c_str());
/*否則需要cin,cout輸入輸出,二者都在#include <iostream>中*/
同時(shí)#include <string>和#include <string.h>是不一樣的,前者是STL的容器,后者則是C語(yǔ)言的頭文件。
string的定義: /*定義*/
string str;
/*初始化定義*/
string str="abcd"; ?
string中內(nèi)容的訪問(wèn): /*訪問(wèn)方式*/
/*下標(biāo)訪問(wèn)法,同字符數(shù)組類似*/
printf("%c",str[i]);/*迭代器訪問(wèn)法,格式與set,vector等不同,不需要typename,因?yàn)閟tring只有字符型*/
string::iterator it;
for(string::iterator it=str.begin();it!=str.end();it++){printf("%c",*it);
}
?
string類型字符串的拼接和比較: /*字符串拼接*/
string str1="abc",str2="def",str3;
str3=str1+str2;/*字符串的比較*/
if(str1 < str2) ...
if(str1 != str2) ...
if(str1 >= str2) ... ?
length()/size()函數(shù): /*返回string的長(zhǎng)度*/
string str="abcxyz",str="opq";
printf("%d %d",str.length(),str.size()); ?
insert()函數(shù): /*insert()函數(shù)兩種插入辦法*/
/*str.insert(pos,string),pos表示插入的位置,string表示要插入的字符串*/
string str="abcdef",str2="opq";
str.insert(3,str2);
/*得到abcopqdef*//*str.insert(it,it2,it3) it是欲插入的位置,it2,it3是待查字符串的首尾迭代器*/
str.insert(str.begin()+3,str2.begin(),str.end())
/*表示在str的第三個(gè)位置插入str2整個(gè)字符串*/ ?
erase()函數(shù)?: /*erase()函數(shù)刪除一個(gè)元素*/
str.erase(str.begin()+4);/*erase()函數(shù)刪除一個(gè)區(qū)間的元素有兩種方式*//*第一種:str.erase(first,last);*/
str.erase(str.begin()+2,str.end()-1);/*第二種:str.erase(pos,length);從pos開(kāi)始刪除length個(gè)元素*/
str.erase(3,2); ?
clear()函數(shù): /*清除字符串*/
str.clear(); ?
substr()函數(shù): /*substr(pos,length);返回從pos個(gè)字符及之后length-1個(gè)字符,即返回字符串*/
string str="helloworld";
str.substr(3,4);
/*得到lowo的字符串*/ ?
string::npos: /*表示-1或者4294967295,一般和str.find()聯(lián)用,如果find(x)==string::npos,表示找到不到*/ ?
find()函數(shù): /*兩種str.find()方式,返回第一次出現(xiàn)的位置*//*str.find(str)*/
if(str.find(str)!=string::npos) ...
/*表示找到了,反之表示沒(méi)找到*//*str.find(str,7)*/
if(str.find(str,7)!=string::npos) ...
/*表示找到了,反之表示沒(méi)找到*/ ?
replace()函數(shù): /*兩種replace()方式*//*str.replace(pos,len,str2); 把str從pos號(hào)位開(kāi)始,長(zhǎng)度為len的字串替換為str2*//*str.replace(it,it2,str2); 把str從it號(hào)位開(kāi)始到it2號(hào)位的前一位(左閉右開(kāi)原則)替換為str2*/ ?
四、map的常見(jiàn)用法
map是可以將任何基本類型映射到任何基本類型的容器。需要#include <map>頭文件和using namespace std;如map<char,int> mp;(是將字符型映射為整型)? map<string.int> mp(將字符串映射為整型),不使用map容器按數(shù)組的定義只能將int型映射為其他類型。
map的常見(jiàn)用途是:需要建立字符(或者字符串)與整數(shù)之間映射關(guān)系之間的題目,使用map可以減少代碼量;判斷打證書(shū)或者其他類型數(shù)據(jù)是否存在的時(shí)候,可一件map當(dāng)做bool使用;字符串和字符串的映射也有可能遇到。
map的定義: /*map容器定義不同與其他容器,其容器定義如下*/map<typename,typename> mp;
/*
第一個(gè)typename表示key,第二個(gè)typename表示value,如
map<char,int> mp;
*/ ?
map容器內(nèi)元素的訪問(wèn): /*map容器內(nèi)元素的訪問(wèn)有兩種方式*//*第一種是下標(biāo)訪問(wèn)*/
mp['a']=1;
printf("%d",mp['a']);/*第二種是使用迭代器訪問(wèn)*/
mp['m']=1;
mp['n']=2;
for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++)printf("%c %d",it->first,it->second);/*在第二個(gè)例子中it->first指向key,it->second指向value,且map會(huì)以key的值從小到大的順序自動(dòng)排序,和set容器自動(dòng)排序一樣,采用紅黑樹(shù)實(shí)現(xiàn)*/ ?
find()函數(shù): /*find(key)返回值為key的映射的迭代器*/
mp.find('a'); ?
erase()函數(shù): /*erase()函數(shù)有兩種使用方法,即刪除單個(gè)元素(有兩種辦法,時(shí)間復(fù)雜度不同)和刪除一個(gè)區(qū)間內(nèi)所有元素*//*使用迭代器刪除單個(gè)元素,時(shí)間復(fù)雜度為O(1)*/
map<char,int>::iterator it=mp.find('a');
mp.erase(it);/*使用key刪除單個(gè)元素,時(shí)間復(fù)雜度為O(logN)*/
map.erase('a');/*刪除一個(gè)區(qū)間內(nèi)所有元素,mp.erase(first,last);還是遵循左閉右開(kāi)原則*/
map<char,int>::iterator it_first=mp.find('a');
map<char,int>::iterator it_last=mp.find('c');
mp.erase(it_first,it_last);
?
size()函數(shù): /*map容器內(nèi)的映射對(duì)數(shù)*/
mp.size(); ?
clear()函數(shù): /*清除map容器中所有元素的函數(shù)*/
mp.clear(); ?
總結(jié)
以上是生活随笔為你收集整理的【2019暑假刷题笔记-STL绪论】总结自《算法笔记》的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。