容器
string
C++中的字符串,算法部分返回值和参数值是int类型,并非迭代器类型
vector
常用的C++单端容器,也可以嵌套容器,STL库中包含的相关算法可以对其灵活使用(赋值,拷贝构造,容量,大小,resize,insert,erase,push_back,pop_back,clear)
list
- 链表式结构,并非连续的内存空间,因此不可以随机存储,动态分配空间,不会造成内存的浪费。
- 两端都可以进行操作
- 常用的函数(和vector类似):assign(), size() , resize() , empty() , insert() , erase(pos) , remove(elem)
- 对于sort和reverse:因为链表不是连续的空间,因为中的函数对它不适用,但是链表有自己的相关成员函数L1.reverse() , L1.sort()用于链表的排序和反转,同样,对于自定义的数据类型,可以采用谓词的方式进行排序。(函数对象的创建需要单独创建,但是重载“==”应该在类中定义)。
map<T1,T2>
- map中的元素都是“pair<T1,T2>”,对组的形式,有map类型和multimap类型,map类型的数据不可以添加基友相同key值的元素,(类似set和multiset)
- 算法:
m.size() , m.empty() , m.swap(m1) , m.insert(elem) , m.erase(key) , m.clear(), m.find(key) , m.count(key)
set
- set不允许容器中有重复的元素, multiset允许容器中有重复的元素
- 算法:
s.size() , s.empty() ,s.swap(m1) , s.insert(elem) , s.erase(key) , s.clear(), s.find(key) , s.count(key)
== 1.注:map和set都采用 insert的赋值方式==
== 2. 注: 因为map和set在定义的时候就已经分别按照key和value按照从大到小的顺序进行排序,因此按照指定的规则排序,需要在创建的时候就添加相应的谓词,作为其排序规则。==
3. 注释map的算法和set的算法类似。
deque
双端数组
stack

栈:先入后出,只能获取top()数据。
queue

队列:先入先出,只能获取头部和尾部的数据
算法
- 很多算法是基于迭代器对容器进行操作。
- 例如,对于算法返回的位置,函数的参数为区间时候一般使用迭代器进行操作。
- 常见的算法有:
-sort(iterator.begin,iterator.end,_pred)
-swap(V),swap(A,B) - 在部分需要添加谓词的算法中,对于自定义数据类型,需要重载相关的“==”,“>”等符号,可以通过算法的底层函数理解该步骤
- 对于自定义数据类型的重载应该在该自定义数据类型中,写一个重载的成员函数。 - 函数对象(仿函数):函数中重载(),因此使用起来类似于函数。
- 返回值是bool类型称为谓词,包含一元谓词和二元谓词,通常和其他的算法一起使用,使用的时候注意,函数对象的本质是一个类,因此使用的时候需要声明对象,如果需要创建一个匿名函数对象,直接使用 “类名+()” 即表示声明函数对象。而对于普通函数,直接传入函数名称即可。
- 对于函数对象是构建一个类(仿函数)需要单独构建,但是对于 “==”或者“>”的重载,应该是在相应的类中进行重载。
- 对于排序(sort)、查找(find)、统计(count)这类算法,除了容器本身具有成员函数以外,STL也有通用的算法,这些算法通常在包含在库中
设计相应的谓词需要注意是一元谓词还是二元谓词!!!
# include <algorithm>
# include <functional>// 对于内建函数:STL自带的仿函数
for_each(v.begin(),v.end(),_func);
// 对于需要将一个容器中的数据复制到另外一个容器中,需要首先对目标容器开辟空间,否则会报vector内存不足或者size相关错误
transformer(v.begin(),v.end(),v_targer.begin(),_func);
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v_targer.begin(),_func)
// 对于部分算法,要求函数需要有一些固定特性,例如merge和binary_search(二分查找法)需要保证原数据是有序的
bool binary_search(iterator beg, iterator end, value);
// 部分函数的返回值是迭代器的位置,
find(v.begin(),v.end(),value);//找不到return v.end()
find_if(v.begin(),v.end(),_pred);// 设计_Pred 函数或者谓词(返回bool类型的仿函数)
count(v.begin(),v.end(),value);
count_if(v.begin(),v.end(),_pred);
sort(iterator beg, iterator end, _Pred);
swap(container c1,container c2)
#include <numeric>
accumulate(iterator beg, iterator end, value); // value:起始累加值
fill(iterator beg, iterator end, value);
// set相关操作需要保证是有序序列
set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest); // 求交集
迭代器
- 提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。
- 每个容器都有自己专属的迭代器
- 迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针
版权声明:本文为wd_2ee原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。