一、vector常见用法详解
- vector翻译为向量,但是这里翻译成变长数组的叫法更好理解。
- 如果typename是一个STL容器,定义的时候要记得在>>符号之间加上空格,因为在C++11之前标准的编译器会把他当成位移操作。vector<vector
> name; - vector
Arrayname[arrySize]和vector<vector > name不一样,其中定义为数组的即第一个中每个都是一个vector容器,一维长度已经固定为arrySize的大小。 - vector元素访问有两种方式,一种是通过下标,还有一种是通过迭代器,通过下标访问和普通数组是一样的操作,重点是通过迭代器访问,vector
::iterator it; 可以把迭代器理解成像指针一样的东西,通过*it可以访问vector里面的内容。在C++11中特别是在for循环中可以写成auto it - v[i]和*(v.begin()+i)是等价的
- 左闭右开记住这个思想
- 迭代器中还实现了两种自加操作:++it和it++(自减同理)迭代器支持it < v.end()因此循环条件一般使用it != v.end()
- 在常用STL容器中,只有vector和string中才允许使用v.begin()+i这种迭代器上加数字的写法。
- 迭代器:vector<typename>::iterator it;
常用函数:
- push_back()就是在vector后添加一个元素,时间复杂度为O(1)
- pop_back()就是在vector末尾删除一个元素,时间复杂度为O(1)
- size()用来获得vector中元素的个数,时间复杂度为O(1),size返回的是unsigned类型,这一点对所有的STL都是一样的。
- clear()用来清空vector中所有的元素
- insert(it, x)用来向vector的任意迭代器it处插入一个元素x,时间复杂度为O(N)
- erase()有两种用法删除单个元素,删除一个区间内的所有元素,时间复杂度均为O(N),erase(it)删除迭代器为it位置处的元素;erase(first, last)例如erase(v.begin(), v.begin()+i),左闭右开。
常见用法:
- 存储数据本身可以作为数组使用
- 用邻接表存储图
二、set的常见用法详解
- set翻译为集合,是一个内部自动有序且不含重复元素的容器。
- set容器的元素只能通过迭代器(iterator)访问。
- set内的元素自动递增排序,且自动去除了重复元素。
- 迭代器:set
::iterator it;
常见函数用法:
- insert(x)可以将x插入set容器中,并自动递增排序和去重,时间复杂度O(logN)。
- find(value)返回set中对应值为value的迭代器。时间复杂度同上。
- erase()有两种用法,删除单个元素;删除一个区间的所有元素。删除单个元素有两种方法:(1)st.erase(it),it为所需删除元素的迭代器,时间复杂度为1,结合find()函数使用(2)st.erase(value),value为所需删除元素的值,时间复杂度为O(logN);然后是删除区间元素st.erase(first, last)记住这里都是迭代器。
- size()用来获得set内元素的个数,时间复杂度为1
- clear()用来清空set中的所有元素,时间复杂度为O(N)。
常见用途:
- 主要作用是存储自动去重和升序。
- 如果需要处理不唯一的则需使用multiset,C++11中还加了unorder_set,以散列代替set内部的红黑树,可以实现只去重不排序的需求。
三、string的常见用法详解
- 在C语言中,一般是使用字符串数组来表示字符串的即char str[],但是C++直接引入string数据类型。
- string str;
- string可以如同字符串数组一样通过下标来访问;也可以通过迭代器来访问。
- 如果要读入或输出整个字符串只能够使用cin或cout,如果强行使用printf输出,可以使用c_str()函数将string强制转化为字符串数组,解决这个问题,printf("%s", str.c_str());
- string迭代器不像其他容器那样需要参数,string::iterator it;
- 同vector一样可以进行数字操作迭代器
常见函数:
- 可以直接进行拼接操作 str += str2;
- compare operator ,可以直接进行比较,是按照字典序来的
- length()/size(), length()返回string的长度,时间复杂度为1
- insert()有多种方法,时间复杂度为O(n),(1)insert(pos, string),pos是下标号,string是要插入的str,(2)insert(it, it2, it3),it是原字符要插入的位置,是迭代器,it2,it3是为待插入字符串的首尾迭代器。
- erase(),有两种用法,删除单个元素、删除一个区间内的所有元素,时间复杂度均为O(N),str.erase(it),it为要删除的迭代器,str.erase(first, last),区间迭代器。str.erase(pos, length),删除位置开始处,length接下来需要删除的长度。
- clear(),清空所有元素,时间复杂度为1.
- substr()提取字符串中子串, substr(pos, len)pos为位置,len为长度。
- string::npos是一个常数,其本身值为-1,可以作为find函数失配的返回值。
- find()返回出现的位置,str.find(str2), str.find(str2, pos),pos是指定开始查找位置。
- replace(), str.replace(pos, len, str2),把str从pos号位置开始,长度为len的子串替换为str2.
四、map的常见用法详解
- map翻译为映射,也是常用的STL容器。因为map可以将任何基本类型映射到任何基本类型。
- map<typename1, typename2> mp;如果是字符串映射到整数,必须使用string而不能使用char数组。
- 访问方式,使用下标访问,也就是键值。也可以使用迭代器访问,和其他迭代器访问方式一样。
- map可以使用it->first来访问键值,使用it->second来访问值。
- map会以键值从小到大的顺序自动排序,因为map内部也是使用红黑树实现的。
常见函数:
- find(key)返回键值为key的映射的迭代器
- erase(),也有两种用法,单个和区间,mp.erase(it/key)注意是迭代器或是键值即可,区间都是迭代器。
- size(),用来返回map中的对数。
- clear(),清空所有元素。
常见用途
- 需要建立字符与整数之间的联系
- 判断大整数或其他类型是否存在,当bool类型使用
- 字符串和字符串之间的映射也有可能会遇到。
五、queue的常见用法详解
- queue翻译为队列,在STL中主要实现了一个先进先出的的容器
- queue内元素访问,因为队列本身是一种先进先出的数据结构,因此只能通过front()来访问队首元素,通过back()来访问队尾元素,通过push()来将元素压入队列。
常见函数:
- push(x), 将元素x压入队列,时间复杂度为1.
- front()、back()分别用于访问队首和队尾元素。
- pop(),让队首元素出列。
- empty()检查队列是否为空,如果为空返回true,否则返回false
- size()返回queue内元素的个数
主要用途:
- 当实现广度优先搜索时,可以不用自己动手实现一个队列。
- 在使用front()back()时,必须先使用empty()判断队列是否为空,否则会出现错误。
六、priority_queue的常见用法详解
- priority_queue又称优先队列,由名字可知队首元素是当前队列中优先级最高的那一个,底层使用堆来进行实现。可以在任何时候使用push()加入元素,会自动调整使得队首优先级最高。
- 优先队列元素访问,和队列不一样,没有front()和back()函数,只能通过top()函数来访问队首元素。
常见函数:
- push()
- top()
- pop()
- empty()
- size()
priority_queue内元素优先级设置
- 基本数据类型优先级设置:
priority_queue<int> q;
priority_queue<int, vector<int>, less<int> > q;//记得最后这两个>>是有空格的,以上两种方法等效对于基本数据类型而言,如果想换数据类型,只需把对应位置的换掉即可,这个是默认优先级数字越大越高,如果想要换成数字低优先级高,可以把less<int> 换成greater<int>.
- 结构体的优先级设置,相对而言更为重要
struct fruit{
string name;
int price;
}
//如果希望价格高的优先级高,就需要重载小于号<,如下:
struct fruit{
string name;
int price;
friend bool operator < (fruit f1, fruit f2){
return f1.price < f2.price;//注意这里是小于号<,跟cmp里面的符号设置相反。原因在于优先队列默认就是把优先级高的放在队首,记住和cmp中相反即可。
}
}
//接下来就可以进行设置fruit类型的队列了,其内部就是价格高的为优先级高,如果想要价格低的优先级高,只需把上面return中的<号换成>号
priority_queue<fruit> q;
//也可将结构体中的部分写在外面,如下:
struct cmp{
bool operator () (fruit f1, fruit f2){
return f1.price < f2.price;
}
}
//上面注意我们把friend去掉了,同时把<号改成了()
//使用之前第二种方式来定义:
priority_queue<fruit, vector<fruit>, cmp> q;//把之前的less<>换成了cmp
//最后指出如果结果体或数据较大,建议使用引用来提高效率,在比较类参数上加上const和&
friend bool operator < (const fruit &f1, const fruit &f2){
return f1.price < f2.price;//注意这里是小于号<,跟cmp里面的符号设置相反。原因在于优先队列默认就是把优先级高的放在队首,记住和cmp中相反即可。
}
常见用途
- 可以用于贪心算法,也可以解决Dijkstra算法进行优化
- 同样在使用前需要用empty()进行判断
七、stack的常见用法详解
- stack翻译为栈,是STL中实现后进先出的容器。
- 定义同其他容器一样
- 内部元素访问,只能通过top()来访问栈顶元素。
常见函数
- push()
- top()
- pop()
- empty()
- size()
常见用途:
- 一般来模拟实现一些递归,防止程序对栈内存限制导致程序运行出错。
八、pair的常见用法详解
- pair是一个很实用的东西,当想把两个元素绑在一起作为一个合成元素,又不想定义结构体时,pair可以很合适的作为一个替代品。
- pair应添加头文件<utility>
- pair定义:
pair<typename1, typename2> name;
//定义时初始化
pair<string, int> p("haha", 5);
//如果想定义临时pair,下面两种方法都可以
pair<string, int>("haha", 5);
make_pair("haha", 5);
- 元素访问,如同结构体一样即可p.first,p.second
- 比较操作数,可以直接进行比较,先用first进行比较,如果first相等,那么再使用second进行比较。
- 常见用途:作为map的键值对来进行插入如下:
map<string, int> mp;
mp.insert(make_pair("haha", 5));
九、algorithm头文件下常见函数
- max(x, y) min(x, y) abs(x) abs(x)中的x必须是整数,如果是浮点数请使用math头文件下的fabs(x)
- swap(x,y),用于交换想x,y的值
- reverse(it, it2)可以将数组指针在左闭右开之间的元素或容器迭代器范围内的元素进行反转。
- next_permutation(a, a+3),全排序列,使用do...while()
- fill(),可以把数组或容器中的某一段区间赋值为一个相同的元素,和memset中不同,这里的数字是可以为类型范围类对应的所有值。fill(a, a+5, 233);
- sort(),排序函数
- lower_bound()和upper_bound()详解见这里:https://www.cnblogs.com/tsruixi/p/11858226.html