标准模板库(Standard Template Library)
三个主要的组件:
1.容器(Containers:容器是用来管理某一类对象的集合(储存数据的一个场所)。
2.算法(Algorithms: 算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
3.迭代器(iterators) 迭代器用于遍历对象集合的元素。
- 容器【序列容器,关联容器】
vector容器:
vector模拟动态数组 vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public拷贝构造函数和重载的赋值操作符)
必须包含的头文件#include < vector>
vector支持随机存取 vector的大小(size)和容量(capacity)
size返回实际元素个数,
capacity返回vector能容纳的元素最大数量。如果插入元素时,元素个数超过capacity,需要重新配置内部存储器。
应用
assign 赋值操作。
at 返回索引所标识的元素的引用,进行越界检查。
back 返回对向量中最后一个元素的引用。
begin 对该向量中第一个元素返回随机访问迭代器。
capacity 返回重新分配空间前可以包含的元素数。 clear 清除向量的元素。
empty 测试矢量容器是否为空。
end 返回指向矢量末尾的随机访问迭代器。
erase 从指定位置删除向量中的一个元素或一系列元素。
front 返回对向量中第一个元素的引用。
insert 将一个元素或多个元素插入到指定位置的向量中。
max_size 返回向量的最大长度。
pop_back删除矢量末尾处的元素。
push_back在矢量末尾处添加一个元素。
rbegin 返回指向反向向量中第一个元素的迭代器。 rend
返回一个指向反向矢量末尾的迭代器。
reserve 扩大容量。
resize 为矢量指定新的大小。
size 返回向量中的元素数量。
swap 交换两个向量的元素。
map/multimap容器:
map中不允许key相同的元素,multimap允许key相同的元素。
map是一个关联容器,是一种映射。
at 查找具有指定键值的元素。
begin 返回一个迭代器,此迭代器指向映射中的第一个元素。
empty 如果映射为空,则返回 true。
end 返回超过末尾迭代器。
erase 从指定位置移除映射中的元素或元素范围。
find 返回一个迭代器,此迭代器指向映射中其键与指定键相等的元素的位置。
insert 将元素或元素范围插入到映射中的指定位置。
lower_bound 返回一个迭代器,此迭代器指向映射中其键值等于或大于指定键的键值的第一个元素。
upper_bound 返回一个迭代器,此迭代器指向映射中其键值大于指定键的键值的第一个元素。
max_size 返回映射的最大长度。
rbegin 返回一个迭代器,此迭代器指向反向映射中的第一个元素。
rend 返回一个迭代器,此迭代器指向反向映射中最后一个元素之后的位置。
size 返回映射中的元素数量。
swap 交换两个映射的元素。
#include <bits/stdc++.h>
using namespace std;
struct T1{
int v;
bool operator<(const T1 &a)const{
return (v < a.v);
}
};
struct T2{
int v;
};
struct cmp{
const bool operator()(const T2 &a, const T2 &b){
return (a.v < b.v);
}
};
int main(){
map<T1, int>mt1;
map<T2, int, cmp>mt2;
map<string, int> m2;
map<string, int>::iterator m2i, p1, p2;
m2["abd"] = 2;
m2["abc"] = 1;
m2["cba"] = 2;
m2.insert(make_pair("aaa", 9));
m2["abf"] = 4;
m2["abe"] = 2;
cout << m2["abc"] << endl;
m2i = m2.find("cba");
if(m2i != m2.end()){
cout << m2i->first << ": " << m2i->second << endl;
}else{
cout << "find nothing" << endl;
}
cout << "Iterate" << endl;
for(m2i = m2.begin(); m2i != m2.end(); m2i++){
cout << m2i->first << ": " << m2i->second << endl;
}
return 0;
}
set
按升序排列每个元素的容器,值也是键。
map 和 set 都仅允许将键或元素的一个实例插入容器中。 如果需要元素的多个实例,用multimap或multiset。有序的map和set支持双向迭代器。
~迭代器举例(遍历)
set::iterator pos;
for(pos=s.begin();s!=s.end();pos++)
~
s.size()-----返回容器中的元素个数
s.empty()-----返回bool类型
- 迭代器
所有容器都提供两种迭代器
container::iterator以“读/写”模式遍历元素
container::const_iterator以“只读”模式遍历元素
迭代器示例:
类别
双向: 双向迭代器 X 可以替代向前迭代器。 但是,还可以递减双向迭代器,如 --X、X-- 或 (V = *X–)。
可以采用与向前迭代器相同的方式访问元素成员和比较双向迭代器。
随机访问: 随即访问迭代器 X 可以替代双向迭代器。
借助随机访问迭代器,可以使用下标运算符 [] 访问元素。 可以使用 +、-、+= 和 -=
运算符向前或向后移动指定数量的元素以及计算迭代器之间的距离。 可以使用 ==、!=、<、>、<= 和 >= 比较双向迭代器。
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int> a;
for (int i = 1; i <= 5; ++i){
a.push_back(i);
}
vector<int>::iterator it;//声明一个迭代器
for (it=a.begin(); it!=a.end(); ++it){//迭代器指向容器开始 并不断+1
cout<<*it<<endl;
}
return 0;
}
【查找】
upper_bound和lower_bound
upper_bound(begin,end,zhi)----返回大于zhi元素的第一个位置
lower_bound(begin,end,zhi)-----返回大于等于zhi元素的第一个位置
例如:
num[]={1,2,2,3,4,5};
lower_bound(num,num+6,2)为num+1
upper_bound(num,num+6,2)为num+3
sort排序
格式:sort(begin,end) //默认按从小到大排序
sort(begin,end,cmp)
例如:int num[]={1,5,6,2,9}
bool cmp(int a,int b)
{
return a>b;
}
sort(num,num+5,cmp); //num[]={9,6,5,2,1}
~
给STL排序
sort(b.begin(),b.end,cmp)
~
vector的find用法
代码示例:
#include< vector>
#include< algorithm>
#include< iostream>
using namespace std;
int main()
{
vectorL;
L.push back(1);
L.push back(2);
L.push back(3);
vector::iterator it=find(L.begin(),L.end(),3);
if(it==L.end())
cout<<“NO”<<endl;
else
cout<<“YES”<<endl;
}
~
~
在查找时使用map十分高效:在相应的的范围内查找字符串所对应的向量下标然后再输出向量下标对应的元素。
查找操作:
精确查找、模糊查找
使用关键字,(find_if())
区间查找
组合查找
C++标准库中的内容是非常丰富的,库其实就是一些函数模板,这个模板适用于任何类型的数据,需要记住每个模板的使用方法、语法规范和功能实现,要在不断的使用过程中慢慢去理解各个类型的区别,比如map和multimap的区别。在今后的学习中,多运用模板库中的内容,这样能避免重复开发,节约了开发时间,提高了开发效率。
在一个功能比较多的程序中,总想一下子把所有方面都顾及到,最后各个方面都做不好。如何保证思路清晰,先把每一个要用到的知识,先单独实现一个小部分,在拿到总的程序中。