STL
1、STL基本概念
STL,即C++的标准模板库。
STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。三个核心组件:容器、算法、迭代器.
容器: 各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种类模板。
算法: 各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种函数模板.
迭代器: Iterator模式是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素。 共5种类型。
仿函数: 仿函数是重载operator()的class对象,因为其行为类似于函数,所以称作仿函数。它也叫做函数对象。
配接器: 一种用来修饰容器或仿函数或迭代器接口的东西。配接器在STL组件的灵活组合运用功能上扮演着轴承、转换器的功能。
配置器 : 负责空间配置与管理,从实现的角度看,配置器是一个实现了动态空间配置、空间管理,空间释放的class template。
2、字符串:string
2.1 简单使用
/**构造**/
string s1;//创建空字符串
const char* str = "hello world";
string s2(str);//使用字符指针str初始化
cout <<"s2="<< s2 << endl;
string s3(s2);//使用一个string对象初始化另一个string对象
cout << "s3=" << s3 << endl;
string s4(10, 'a');//使用n个字符初始化
cout << "s4=" << s4 << endl;
/**赋值(assign)**/
1.=运算符
2.assign函数
/**字符串拼接(append)**/
1. +=运算符
2.append函数
/**字符串的比较**/
逐一比较每个字符的ASCII,若全部相等,返回0,若str1的ASCII大于str2则返回1,否则返回-1
2.2 字符串存取
at()函数
2.3 erase函数(删除)
/**begin是头迭代器,end是尾迭代器*/
string s="5418340";
s.erase(s.begin());//删除第一个
s.erase(--s.end());//删除最后一个
cout<<s;
2.4 insert函数(插入)
string str1 = "hello";
str1.insert(1, "big");//在某个位置插入
cout << str1 << endl;
2.5 substr函数(获取)
复制子字符串,要求从指定位置开始,并具有指定的长度
/**begin是头迭代器,end是尾迭代器*/
string s="5418340";
s=s.substr(1,3);//取418,取索引为1,往后截断3个
s=s.substr(1,-1);//索引为1,截断到最后
cout<<s;
迭代器
for(string::iterator it=s.begin();it!=s.end();it++)
cout<<*it;
化简:
for(auto it=s.begin();it!=s.end();it++) cout<<*it;
C++11的新特性
for(auto x:s) cout<<x;
3、不定长数组:vector
vector和普通数组的区别:数组是静态空间,而vector可以动态扩展
3.1 初始化vector
3.2 vector的赋值
vector<int> v1(4);//一个4个大小的vector,初始为0
vector<int> v2(4,6);//一个4个大小的vector,初始为6
vector<int> v3{1,2,3,4,5};//一个vector,数字为1,2,3,4,5
for(auto x:v3) cout<<x;
3.3 用at或者[]获取元素
vector<int> v{1,2,3,4,5};
cout<<v[1];//取索引为1的
cout<<v.at(2);//取索引为2的
3.4 vector的插入和删除
push_back()//尾部插入元素
pop_back()//尾部删除元素
insert(pos,ele)//向指定的索引位置插入元素
insert(pos,n,ele)//向指定的索引位置插入n个元素
erase(pos)//删除指定索引的元素
erase(start,end)//删除start到end之间的元素
clear()//清空容器
3.5 vector数据存取
front()//第一个元素
back()//最后一个元素
3.6 其他
重置大小:resize()
v1.resize(10);
size();//获取大小
4、集合:set
1)set中的元素都是排好序的
2)set集合中没有重复的元素
4.1 构造
4.2 赋值
4.3 大小和交换
s.size();//获取大小
s.empty();//判断为空?
s.swap();//交换
4.4 插入和删除
insert(ele);
clear();
erase(pos);
erase(beg,end);
erase(ele);
4.5 查找、统计
find(key);//查找key是否存在,若存在,则返回该键元素的迭代器,若不存在,则返回set.end();
count(key);//统计key的个数
4.6 对set排序
set<int> s;//树状结构,有序
unordered_set<int> s2;//哈希结构,无序,快
s.insert(3);
s.insert(4);
s.insert(4);
s.insert(4);
cout<<s.size()<<endl;
for(auto tmp:s)
cout<<tmp<<" ";
cout<<endl;
for(auto it=s.begin();it!=s.end();it++)
cout<<*it<<" ";
cout<<endl;
5、映射:map
关联数组
m.insert()//插入
m.erase()//删除
size();
empty();
clear()//清空
6、栈:stack
push();//入
pop();//出栈
top();
7、队列:queue
只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作
push();
pop();
front()//队首
back()//队尾
8、链表:list
list<int> li;
li.push_back(6); //末尾添加元素
li.pop_font();//删除开头元素
li.push_front(5); //开头添加元素
li.emplace_front(9); //开头添加元素
li.emplace_back(10); //末尾添加元素
li.insert(++li.begin(),2); //插入,与vector一样
for(auto tmp:li) cout<<tmp<<endl;
for(auto it=li.begin();it!=li.end();it++) cout<<*it<<endl;
9、排序与检索:sort
sort 升序、降序
a,n个元素
sort(a,a+n)
sort(a.begin(),a.end(), compare())
例1-1 *
现有一个数列a,包含了N个非负整数。要求你先把这些数从小到大排序,然后会对你进行Q次询问,每次询问都会问你此数列中是否存在整数x。若存在,请输出整数x在序列中第一次出现的位置(位置从1开始),否则输出“No Found”。
//a数组里一个指定的元素
sort()
lower_bound((a,a+n,x)-a) ; //查找>=x的第一个位置
输入格式:
第一行输入两个整数N和Q,分别表示有N个非负整数和进行了Q次询问。第二行输入N个非负整数。接下来输入Q个整数,分别表示第i次询问中所问的数字x。
输出格式:
对每个样例,输出Q行数字,对每行的输出,若数列中存在整数x,输出x在序列中的位置(位置从1开始),否则输出“No Found”。
样例输入:
4 1
2 3 5 1
5
5 2
1 3 3 3 1
2 3
样例输出:
4
no found
3
分析:
使用algorithm头文件中的sort和lower_bound。
#include<bits/stdc++.h>
using namespace std;
//数列a
const int maxn=1e5;
int a[maxn];
int main() {
int q,x,n;
cin>>n>>q;
for(int i=0; i<n; i++) {
cin>>a[i];//输入数列a
}
sort(a,a+n);//从小到大排序
while(q--) {
cin>>x;
int pos=lower_bound(a,a+n,x)-a; //查找x
if(a[pos]==x) {
cout<<pos+1;//输出位置
} else {
cout<<"No Found"<<endl;
}
}
}
逆序单词
输入一行字符串,将字符串逆序打印。
输入:hello world my name is dyx
输出:dyx is name my world hello
push()//入
pop()//出
#include<bits/stdc++.h>
using namespace std;
int main() {
//string + 栈
string str;
stack<string>s;//栈
getline(cin,str);//输入str
stringstream ss;//对字符串输入输出操作(输入输出流)
ss<<str;
while(ss>>str)
{
s.push(str);//入栈
}
while(!s.empty())//判断是否栈空
{
cout<<s.top();//输出栈顶元素
s.pop();//出栈
if(s.size()!=0)
cout<<" ";
}
}
12、 merge 、 reverse 等等
练习:
s name my world hello
push()//入
pop()//出
#include<bits/stdc++.h>
using namespace std;
int main() {
//string + 栈
string str;
stack<string>s;//栈
getline(cin,str);//输入str
stringstream ss;//对字符串输入输出操作(输入输出流)
ss<<str;
while(ss>>str)
{
s.push(str);//入栈
}
while(!s.empty())//判断是否栈空
{
cout<<s.top();//输出栈顶元素
s.pop();//出栈
if(s.size()!=0)
cout<<" ";
}
}
STL容器参考手册(翻译):https://www.cnblogs.com/barney-li/p/4186681.html