C++标准模板库(STL)学习笔记

一、vector(变长数组)

1、使用vector

#include <vector>
using namespace std;

2、vector的定义

vector<int> vi;//定义了一个int型的长度可变的数组vi

3、vector容器内元素的访问

(1)通过下标访问
for(int i=0;i<vi.size();i++){
	cout<<vi[i]<<" ";
}
//遍历vector<vector<int>> vi
for(int i=0;i<vi.size();i++){
	for(int j=0;j<vi[i].size();j++){
		cout<<vi[i][j]<<" ";
	}
	cout<<endl;
}
(2)通过迭代器访问(迭代器可以理解为一种类似指针的东西)
vector<int>::iterator it=vi.begin();
for(int i=0;i<vi.size();i++){
	cout<<*(it+i)<<" ";
}

​ 或者

for(vector<int>::iterator it=vi.begin();it!=vi.end();it++){
	cout<<*it<<" ";
}//注意:vector的迭代器不支持it<vi.end()的写法

4、vector的常用函数

(1)push_back()

​ push_back(x)就是在vector后面添加一个元素x。

(2)pop_back()

​ pop_back()用以删除vector的尾元素。

(3)size()

​ size()用来获得vector中元素的个数。

(4)clear()

​ clear()用来清空vector中的所有元素。

(5)insert()
vi.insert(vi.begin()+2,-1);//将-1插入vi[2]的位置
(6)erase()
//删除单个元素
vi.erase(vi.begin()+3);//删除vi[3]位置上的元素
//删除一个区间内的所有元素。erase(first,last)即删除[first,last)内的所有元素
vi.erase(vi.begin()+1,vi.begin()+4);//删除vi[1]、vi[2]、vi[3]

二、set(一个能进行自动递增排序且自动去除重复元素的集合)

1、使用set

#include <set>
using namespace std;

2、set的定义

set<int> st;//定义了一个int型的名为st的集合

3、set容器内元素的访问(set只能通过迭代器访问)

for(set<int>::iterator it=st.begin();it!=st.end();it++){
	cout<<*it<<" ";
}//除开vector和string之外的STL容器都不支持*(it+i)的访问方式,因此只能按如上方式访问

4、set的常用函数

(1)insert()

​ insert(x)可将x插入set容器中,并自动递增排序和去重。

(2)find()/count()
set<int>::iterator it=st.find(2);//在set集合中查找值为2的元素,返回其迭代器(指针)
st.count(2);//返回集合中2的个数
(3)erase()
//删除单个元素
st.erase(st.find(100));//方法一:利用find()函数找到100的迭代器,然后用erase删除它
st.erase(100);//方法二:直接删除set中值为100的元素
//方法二写法简便,但时间复杂度更高
//删除一个区间内的所有元素(左闭右开)
set<int>::iterator it=st.find(30);
st.erase(it,st.end());//删除>=30的元素
(4)size()

​ size()用来获得set内元素的个数。

(5)clear()

​ clear()用来清空set中的所有元素。

三、string(字符串)

1、使用string

#include <string>
using namespace std;

2、string的定义(跟基本数据类型相同)

string str;
string str="abcd";

3、string中内容的访问

//可以像字符数组那样通过下标访问string
string str="abcd";
for(int i=0;i<str.length();i++){
	cout<<str[i];//输出abcd
}
//读入和输出整个字符串
string str;
cin>>str;
cout<<str;

4、string的常用函数

(1)+(可以将两个string直接拼接起来)
string str1="abc",str2="xyz",str3;
str3=str1+str2;//str3="abcxyz"
str1+=str2;//str1="abcxyz"
(2)两个string类型可以直接使用==、!=、<、<=、>、>=比较大小,比较规则是字典序
(3)length()/size()
string str="abcxyz";
cout<<str.length()<<endl;
cout<<str.size()<<endl;
//均可以用来返回字符串的长度
(4)insert()
string str="abcxyz",str2="opq";
str.insert(3,str2);//往str[3]位置处插入opq,使str="abcopqxyz"。这里str2的位置直接写"opq"也是可以的
str.insert(0,"*");//使用insert()函数插入的必须要是字符串,所以要用双引号而不能用单引号
(5)erase()
//删除单个元素
string str="abcdefg";
str.erase(str.begin()+4);//删除了e
//删除一个区间内的所有元素
string str="abcdefg";
str.erase(3,2);//删除从3号位开始的两个字符,即de
(6)clear()

​ 清空字符串

(7)substr()

注意:substr()函数不会改变原字符串,而是返回一个新生成的子串。

string str="thank you";
cout<<str.substr(0,5)<<endl;//从0号位开始,截取长度为5的子串,即"thank"
string str2="我abc们def";
cout<<str2.substr(0,6)<<endl;//输出"我abc"。若截取的边界刚好卡在中文字符上,则自动不输出中文
(8)find()

​ str.find(str2),当str2是str的子串时,返回其在str中第一次出现的位置;如果str2不是str的子串,则返回 string::npos。

​ str.find(str2,pos),从str的pos号位开始匹配str2,返回值与上述相同。

(9)replace()

​ str.replace(pos,len,str2)把str从pos号位开始、长度为len的子串替换为str2。

四、map(建立映射关系)

1、使用map

#include <map>
using namespace std;

2、map的定义

map<string,int> mp;//建立了从字符串到整型的映射。键(key)的类型是string,值(value)的类型是int

3、map容器内元素的访问

(1)通过下标访问
map<char,int> mp;
mp['c']=20;//建立了键c到值20这样的一个映射关系
mp['c']=30;//20被覆盖。map中的键是唯一的
cout<<ma['c'];//输出30
(2)通过迭代器访问
map<char,int> mp;
mp['m']=20;
mp['r']=30;
mp['a']=40;
for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++){
	cout<<it->first<<" "<<it->second;
}//用it->first来访问当前映射的键,用it->second来访问当前映射的值
//输出
a 40
m 20
r 30
//map会以键从小到大的顺序自动排序

4、map的常用函数

(1)find()
map<char,int> mp;
mp['a']=1;
mp['b']=2;
mp['c']=3;
map<char,int>::iterator it=mp.find('b');//find(key)返回键为key的映射的迭代器
cout<<it->first<<" "<<it->second;//输出:b 2
(2)erase()
//删除单个元素
map<char,int>::iterator it=mp.find('b');
mp.erase(it);//删除b 2
//或者
mp.erase('b');//删除键为b的映射,即b 2
//删除一个区间内的所有元素
map<char,int>::iterator it=mp.find('b');//令it指向键为b的映射
mp.erase(it,mp.end());//删除it之后的所有映射,即b 2和c 3
(3)size()
map<char,int> mp;
mp['a']=1;
mp['b']=2;
mp['c']=3;
cout<<mp.size();//size()用来获得map中映射的对数,输出3
(4)clear()
mp.clear();//用来清空map中的所有元素

五、queue(队列)

1、使用queue

#include <queue>
using namespace std;

2、queue的定义

queue<int> q;

3、queue容器内元素的访问

cout<<q.front()<<" "<<q.back();//只能通过front()来访问队首元素,或是通过back()来访问队尾元素

4、queue的常用函数

(1)push()
q.push(x);//将x入队列q
(2)front()、back()

​ front()和back()可以分别获得队首元素和队尾元素。

(3)pop()
q.pop();//令队列q的队首元素出队
(4)empty()

​ q.empty()检测队列q是否为空,q为空则返回true,q非空则返回false。

(5)size()

​ q.size()用以返回队列q中元素的个数。

六、stack(栈)

1、使用stack

#include <stack>
using namespace std;

2、stack的定义

stack<int> st;

3、stack容器内元素的访问

cout<<st.top();//只能通过top()来访问栈顶元素

4、stack的常用函数

(1)push()
st.push(x);//将x压入栈st中
(2)top()
st.top();//访问栈顶元素
(3)pop()
st.pop();//弹出栈顶元素
(4)empty()

​ st.empty()可以检测stack内是否为空,栈空则返回true,栈非空则返回false。

(5)size()

​ st.size()用以返回stack内元素的个数。

七、algorithm头文件下的常用函数

1、使用algorithm

#include <algorithm>
using namespace std;

2、常用函数

(1)max()、min()和abs()

​ max(x,y)和min(x,y)分别返回x和y中的最大值和最小值,且参数必须是两个(可以是浮点数)。如果想要返 回三个数x,y,z的最大值,可以使用max(x,max(y,z))的写法。

​ abs(x)返回x的绝对值。注意:x必须是整数。浮点型的绝对值请用math头文件下的fabs。

(2)swap()

​ swap(x,y)用来交换x和y的值。

(3)reverse()
int a[10]={10,11,12,13,14,15};
reverse(a,a+4);//将a[0]~a[3]反转,使数组a变成了{13,12,11,10,14,15}
string str="abcdefghi";
reverse(str.begin()+2,str.begin()+6);//对str[2]~str[5]反转,使字符串str变成了"abfedcghi"
reverse(str.begin(),str.end());//将整个字符串反转,使字符串str变成了"ihgfedcba"
(4)fill()
int a[5]={1,2,3,4,5};
fill(a,a+5,233);//将a[0]~a[4]均赋值为233
(5)sort()
//默认情况
sort(a,a+4);//将数组a[0]~a[3]按从小到大排序
sort(str.begin(),str.end());//将字符串str中的每个字符按从小到大排序
sort(vi.begin(),vi.end());//将vector变长数组vi中的所有元素按从小到大排序
//若想要实现从大到小的排序,则需要实现比较函数cmp
bool cmp(int a,int b){
	return a>b;
}
……
sort(a,a+4,cmp);
……
//也可以使用greater<待排序元素的类型>()实现从大到小的排序
sort(str.begin(),str.end(),greater<char>());//将字符串str中的每个字符按从大到小排序
//结构体数组的排序
struct node{
	int x,y;
}ssd[10];
bool cmp(node a,node b){
	return a.x>b.x;
}//按x值从大到小对结构体数组排序

bool cmp(node a,node b){
	if(a.x!=b.x)
		return a.x>b.x;
	else
		return a.y<b.y;
}//先按x从大到小排序,但当x相等的情况下,按照y的大小从小到大来排序
(6)lower_bound()和upper_bound()
lower_bound(a,a+10,1);//返回a[0]~a[9]范围内第一个值>=1的元素的位置
upper_bound(a,a+10,1);//返回a[0]~a[9]范围内第一个值>1的元素的位置
(7)transform()函数
transform(str.begin(),str.end(),str.begin(),::tolower);//将字符串str全部转化为小写
transform(str.begin(),str.end(),str.begin(),::toupper);//将字符串str全部转化为大写
posted @ 2020-02-12 14:48  Java程序员的进阶之路  阅读(183)  评论(0编辑  收藏  举报