一、C++标准库:
容器、分配器、算法、迭代器、、适配器、仿函数。
容器解决了内存的问题,存储数据,由分配器支持:
1.容器有:string、vector、deque(双端队列)、list(双向链表)、forward_list、queue、priority_queue(优先队列)、stack、四种关联容器:set(集合,自动排序)、multiset、map、multimap、四种无关容器:unordered_set、unordered_multiset、unordered_map、unordered_mutimap。
2.分配器,用于分配管理内存空间:
3.迭代器是一种检查容器内元素并遍历元素的数据类型,通常用于对C++中各种容器内元素的访问,但不同的容器有不同的迭代器,初学者可以将迭代器理解为指针
它们都支持:
-
比较两个迭代器是否相等(==、!=)。
-
前置和后置递增运算(++)。
-
读取元素的解引用运算符(*)。只能读元素,也就是解引用只能出现在赋值运算符的右边。
-
箭头运算符(->),解引用迭代器,并提取对象的成员。
迭代器的种类这里不做描述,我们来说说哪些数据结构支持迭代器:
-
vector ——随机访问迭代器
-
deque——随机访问迭代器
-
list —— 双向迭代器
-
set / multiset——双向迭代器
-
map / multimap——双向迭代器
-
stack——不支持迭代器
-
queue——不支持迭代器
4.算法处理容器的数据,通过迭代器(半自动的指针):
算法一般包含的头文件为:<algorithm>、<functional>、<numeric>
一般函数:(要多加联系)
max()、min()、for_each(iterator beg,iterator end,_func):遍历容器,第一个为起始迭代器、第二个为结束迭代器、第三个为函数或者函数对象、查找算法:find查找元素、find_if根据条件查找、count返回元素个数、count_if()根据条件返回元素个数、adjacent_find查找相邻且重复的元素、binary_find()查找指定元素,但是不能查找无序元素、sort()排序函数、random_shuffle(iterator beg,iterator end)打乱函数、merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator target_beg)合并容器函数:注意要提前开辟空间、并且要同一个顺序。reverse()反转函数、swap()交换两个容器的元素,或者仅仅交换两个元素、replace()将容器内指定范围的旧元素替换为新元素、replace_if()按条件将替换元素、set_intersection()求交集、set_union()求并集()、set_difference()求差集。
5.仿函数(Functor)又称为函数对象(Function Object)是一个能行使函数功能的类。
6.适配器就是接口,对容器、迭代器、算法进行包装,但其实质还是容器、迭代器和算法,只是不依赖于具体的标准容器、迭代器和算法类型,适配器可以是算法适配器、迭代器适配器、容器适配器。
下面是对一段代码的解释,它详细描述了一个程序的各个代码是属于STL标准库的哪个部分
举例子:
1.vector<int ,allocator<int>> allocator为分配器,如果没有则为默认值。
2.count_if(vi.begin(),vi.end(),not1(bind2nd(less<int>(),40));其中count_if是算法,根据它的名字我们可以明白它是一个通过条件得到相加值的,里面的括号第一个元素和第二个元素是处理数据的范围,第三个元素是一层套一层。最里面的less<int>(),是仿函数,int是处理的数据类型,40是里面的第二个元素,在外面嵌套的是bind2nd它是一个函数适配器,它作为桥梁代表处理小于40的数据。最外面也是函数适配器它代表否定第一个元素,也就是大于或者等于40.
3.Container<T>::iterator ite = c.begin();其中iterator是一个范指针,它可以使用指针的所有操作。
4.在c++11后支持for(decl : coll){
statement;
}其中decl是容器,coll是元素的合集,statement是具体操作。其中auto就是Container<T>::iterator ,auto&是引用,这样才能修改得到的元素。
二、如何使用容器:
类型:
1.序列容器:list、vector、Deque、array、Forward-List适合做快速的查找
2.关联容器:Set/Multiset、Map\Multimap、(multi表示可以重复)、还要无序的map和set,它们也有可重复和不可重复的、HashTable:哈希表可以由多种方式实现,一般用链表实现,哈希表用于记录
注意:下面图片的容器名字可能有改变,请注意分别
容器的限制与缺陷、效率:
array(数组):
1.头文件:#include <array>
2.定义:array(long,size)//第一个为数据类型,第二个为大小
3.遍历:这里不过多描述,用for循环就可以了
4.函数:size()、front()、back()、data():传回该数组的地址
----------------------------------------------------------------------------------------------------------------------------
待补充
杂谈:
rand()获得随机数:int num = rand() % n +a;
其中的a是起始值,n-1+a是终止值,n是整数的范围。