C++STL六大部件概述以及容器结构概述

几个关于C++的几个学习网站:
http://www.cplusplus.com
https://en.cppreference.com
http://gcc.gnu.org

  1. 容器(Containers)
  2. 分配器(Allocators)
  3. 算法(Algorithms)
  4. 迭代器(Iterators)
  5. 适配器(Adapters)
  6. 仿函数(Functors)
    C++STL六大部件概述以及容器结构概述_第1张图片
    一、六大部件之间存在的关系:
1.容器:存放我们要操作的数据,可以是数字、对象等;
2.分配器:容器需要占用内存,容器占用的内存由分配器分配;
3.算法:被独立出来的模板函数,用来操作容器,包块常见的排序算法、查找算法等;
4.迭代器:算法既然要操作容器中的数据,需要有工具访问容器中数据,那就是迭代器,是一种泛化的指针;
5.容器适配器:一些容器底层和数据操作具有一定的相似,所以一些容器使用其他容器作为底层数据结构,
            将其他容器的函数转换为自己的函数;
6.仿函数:实际上是类中的operator()小括号运算符重载函数,存在类似函数的行为。

二、STL中常用的头文件以及六大部件的简单使用

#include
#include
#include
......
#include //算法
#include//仿函数

#include
#include
#include
#include
using namespace std;


int main()
{
	int arr[6] = {10,9,6,8,5,2};
	vector < int, allocator >ve(arr,arr+6);
	//容器vector:指定存放int数据
	//分配器allocator:不指定只有默认的
	
	cout << count_if(ve.begin(), ve.end(), not1(bind2nd(less(), 40)));
	//算法:count_if 在我给的条件下(begin到end之间的数字),不小于数字40有多少个
	//less仿函数,小于
	//bind2nd仿函数适配器:绑定第二个参数
	//not1仿函数适配器: 否定的意思,所以找大于等于40的数字
	
	return 0;
}

三、“前闭后开区间 [ )“原则

begin():指向的是第一个数据
end():指向最后一个元素的下一个元素,所以解引用*(end())会发生越界,所以开区间表示不能访问
      注意end指向的位置

C++STL六大部件概述以及容器结构概述_第2张图片
模板函数:通用的遍历容器函数

container c;
container::iterator it = c.begin();
for(; i t!=c.end();  ++it)
{
	//dosomething
}

C++11中的写法:

for( decl : coll)
{
	//do something
}
//和python中的写法基本一致  左边是容器中数据类型,右边是容器
for(int i : {1,2,3,4,5,6})
{
	cout< vec;
......
for(auto elem : vec)
{
	cout<

最后看一个对比C++11的例子:

list l;
......
list::iterator it;  //需要我们指定迭代器的类型
it ......

C++11中
list l;
auto it ......

四、STL常用容器的底层数据结构:

//顺序容器
vector:动态开辟的数组,可自动扩容,向量容器
deque:双端队列容器,两端可进可出
list::双向链表
array:数组
forward_list:单向链表

//关联容器:集合和映射表  根据key找value,底层自平衡红黑树
set/multiset:单重集合(元素不可重复)/多重集合(元素可以重复)
             只保存key,key==value,但是key和value等价
map/multimap:映射表( 每个key对应一个value)/多重映射表 (key可以重复)

multi表示允许有重复的key
set和map存放独一无二的数据


//实际上也是一种关联容器,底层hashtable,C++11新增容器,容器中数据根据hash算法存放
unordered set/unordered  multiset:
unordered map/unordered  multimap:



容器适配器:
stack => deque
queue =>deque
priority_queue=>vector + 大根堆(最大的排在堆顶,其他元素不用排序) 


文章中图片来源于网络,侵联删。

你可能感兴趣的:(C++,STL,C++STL)