AYIT-2021 609暑假集训STL专题训练
从此习题集的题中所学以及补充:
1.C++ 的输入输出:
头文件:<iostream >
cin语句的一般格式为:
cin>>变量1>>变量2>>……>>变量n;
cout语句的一般格式为:
cout<<表达式1<<表达式2<<……<<表达式n;
若要输出一定小数位数的浮点数需要:
增加头文件<iomanip> 以及
cout<<setiosflags(ios::fixed)<<setprecision(n);
n为要保留的小数位数
getline()
用法:接收一个字符串,可以接收空格并输出,需包含“#include<string>”
用法类似于gets()
2.map容器的简单使用
头文件<map>
定义方法:
map<变量类型1,变量类型2> 变量名;
变量类型1和变量类型2可以不同
变量类型1为 关键字(key)
变量类型2为 该关键字的值(value)
常用数组形式插入值,如:
map<int,int> m;
m[1]=2;
常用清空操作:
m.clear();
map的基本操作函数:
C++ maps是一种关联式容器,包含“关键字/值”对
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数, (帮助评论区理解: 因为key值不会重复,所以只能是1 or 0)
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
3.set容器的简单使用
头文件<set>
定义方法:
set<变量类型> 变量名;
常用插入方式:
set<int> s;
s.insert(与定义相同的类型数值,此处为int型);
注意:
1、set中的元素都是排好序的
2、set集合中没有重复的元素
set的基本操作函数:
begin() 返回set容器第一个元素的迭代器
end() 返回一个指向当前set末尾元素的下一位置的迭代器.
clear() 删除set容器中的所有的元素
empty() 判断set容器是否为空
max_size() 返回set容器可能包含的元素最大个数
size() 返回当前set容器中的元素个数
rbegin() 返回的值和end()相同
rend() 返回的值和begin()相同
4.vector容器的简单使用
头文件<vector>
定义方法:
vector<变量类型> 变量名;
vector的基本操作函数:
vector<int> a,b;
a.assign(4,2); a含有4个值为2的元素
a.back(); 返回a的最后一个元素
a.front(); 返回a的第一个元素
a[i]; 返回a的第i元素,当且仅当a存在
a.clear(); 清空a中的元素
a.empty(); 判断a是否为空,空则返回true,非空则返回false
a.pop_back(); 删除a向量的最后一个元素
a.push_back(5); 在a的最后一个向量后插入一个元素,其值为5
a.size(); 返回a中元素的个数
a.capacity(); 返回a在内存中总共可以容纳的元素个数
a.resize(10); 将a的现有元素个数调整至10个,多则删,少则补,其值随机
a.resize(10,2); 将a的现有元素个数调整至10个,多则删,少则补,其值为2
a.reserve(100); 将a的容量扩充至100,
a.swap(b); b为向量,将a中的元素和b中的元素整体交换
a==b; b为向量,向量的比较操作还有 != >= > <= <
a.erase(a.begin()+1,a.begin()+3); 删除a中第一个(从第0个算起)到第二个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)结束
a.assign(b.begin(),b.begin()+3); b为向量,将b的0-2个元素赋值给向量a
a.insert(a.begin()+1,5); 在a的第一个元素(从第0个算起)位置插入数值5,
a.insert(a.begin()+1,3,5); 在a的第一个元素(从第0个算起)位置插入3个数,其值都为5
a.insert(a.begin()+1,b+3,b+6); b为数组,在a的第一个元素(从第0个元素算起)的位置插入b的第三个元素到第5个元素(不包括b+6)
sort(a.begin(),a.end()); 排序a
5.lower_bound( )和upper_bound( )的简单用法
重要前提:在从小到大的排序数组中
要求结果的地址==lower_bound(起始地址,结束地址,要找的值)-起始地址;
要求结果的地址==upper_bound(起始地址,结束地址,要找的值)-起始地址;
两者区别:
lower_bound:返回数组中第一个大于或等于被查数的值的地址
upper_bound:返回数组中第一个大于被查数的值的地址
6.string的简单用法
定义方法:
string 变量名;
此次练习集用到的相关函数:
string a,b;
char c[N];
find:
a.find(b); 在字符串a中寻找子字符串b,若未找到返回-1
assign:
a.assign(b,int start,int n); 把字符串b中从start开始的n个字符串赋给当前字符串a
string与char[]的相互转换:
string转char[]:
for(int i=0;i<a.length();i++)
c[i]=a[i];
c[i]='\0'; //这一步比较重要
char[]转string:
a=c;
string的基本操作函数:
string &operator=(const string &s); 把字符串s赋给当前字符串
string &assign(const char *s); 用c类型字符串s赋值
string &assign(const char *s,int n); 用c字符串s开始的n个字符赋值
string &assign(const string &s); 把字符串s赋给当前字符串
string &assign(int n,char c); 用n个字符c赋值给当前字符串
string &assign(const string &s,int start,int n); 把字符串s中从start开始的n个字符赋给当前字符串
string &assign(const_iterator first,const_itertor last); 把first和last迭代器之间的部分赋给字符串
7.迭代器的简单用法
类似于C语言的指针
例如:
map<int,int> mm;
map<int,int>::iterator it; //要与所指对象类型一致
for(it=mm.begin();it!=mm.end();it++)
if((*it).second>1)
sum++;
其他:
各个容器的find函数: 变量名.find(要找的值) 若是未找到相应值则会返回与 变量名.end() 相等的值