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全部转化为大写
C++标准模板库(STL)学习笔记的更多相关文章
- 标准模板库(STL)学习探究之stack
标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- 标准模板库(STL)学习指南之sort排序
对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算法也基本固定下来,不需要你再去花费心思 ...
- 标准模板库(STL)学习指南之List链表
本文转载自天极网,原文地址:http://www.yesky.com/255/1910755.shtml.转载请注明 什么是STL呢?STL就是Standard Template Library,标准 ...
- 标准模板库(STL)学习指南之priority_queue优先队列
转载自CSDN博客:http://blog.csdn.net/suwei19870312/article/details/5294016 priority_queue 调用 STL里面的 make_h ...
- 标准模板库(STL)学习指南之set集合
set是关联容器.其键值就是实值,实值就是键值,不可以有重复,所以我们不能通过set的迭代器来改变set的元素的值,set拥有和list相同的特性:当对他进行插入和删除操作的时候,操作之前的迭代器依然 ...
- 标准模板库(STL)学习指南之map映射
转载自CSDN博客:http://blog.csdn.net/bat603/article/details/1456141 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关 ...
- 标准模板库(STL)学习指南之vector向量
vector – 一. vector可以模拟动态数组 – 二. vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public 拷贝构造函数和重载的赋值操作符) 三.必须包含的头文 ...
- 标准模板库(STL)学习探究之Multimap容器
C++ Multimaps和maps很相似,但是MultiMaps允许重复的元素.(具体用法请参考map容器) 函数列表: begin() 返回指向第一个元素的迭代器 cle ...
- STL学习系列之一——标准模板库STL介绍
库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ...
随机推荐
- C++简单项目--贪吃蛇
在800*600的地图上,蛇的初始长度为3节,用数组记录每一节的位置(每个正方形左上角的坐标),每一节为长度为10的正方形,初始方向向右.随机生成30个障碍物的的位置,随机生成食物的位置.吃到食物之后 ...
- 「2018-11-05模拟赛」T5 传送机 解题报告
5.传送机(sent.*) 问题描述: 黄黄同学要到清华大学上学去了.黄黄同学很喜欢清华大学的校园,每次去上课时总喜欢把校园里面的每条路都走一遍,当然,黄黄同学想每条路也只走一遍. 我们一般人很可能对 ...
- 01_console 你真的了解吗,不曾了解过得console~
对于 console 你只知道 console.log 吗? 那你就 out 啦!!! // 1. 显示信息 console.log('hello'); console.info('信息'); con ...
- LEFT函数使用
详解:LEFT函数用于从一个文本字符串的第一个字符开始返回指定个数的字符 1.提取A2单元格从左往右2位字符 2.函数使用用途: LEFT函数用于从一个文本字符串的第一个字符开始返回指定个数的字符 语 ...
- 《图解机器学习-杉山将著》读书笔记---CH5
CH5 稀疏学习 重点提炼 提出稀疏学习的缘故: 虽然带有约束条件的最小二乘学习法结合交叉验证法,在实际应用中是非常有效的回归方法,但是,当参数特别多时,计算参数以及预测值需要大量时间.此时,我们要解 ...
- 观察者模式的应用:Winform窗体之间传值
观察者模式的应用:Winform窗体传值 观察者模式的概念: 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并更新. 今天我们就学着用一下这个观察者模式,先想象 ...
- EF 使用lambda表达式 更新一对多数据时报错
1.需求 更新一对多表中的附表数据,表结构如下: 2.思路 个人觉得一个个去对比关联的附表数据是删除还是添加比较麻烦,就直接清空主表关联的附表,然后重新建立关联关系. 3.弊端 如果附表(前提是附表 ...
- 使用Java实现简单的Http服务器
在Java中可以使用HttpServer类来实现Http服务器,该类位于com.sun.net包下(rt.jar).实现代码如下: 主程序类 package bg.httpserver; import ...
- 1z0-062 题库解析4
题目: Examine this parameter: NAME TYPE VALUE ------------------------ -- ...
- Java 使用Scanner时的NoSuchElementException异常
做实验时设计了一个类,在类中的两个不同函数中分别创建了两个Scanner对象,并且在各个函数的结尾使用了close()方法,结果在运行时产生了NoSuchElementException异常. 实验的 ...