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

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

#include<vector>
#include<list>
#include<map>
......
#include<algorithm> //算法
#include<functional>//仿函数

#include<vector>
#include<algorithm>
#include<functional>
#include<iostream>
using namespace std;


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

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

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

在这里插入图片描述
模板函数:通用的遍历容器函数

container<T> c;
container<T>::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<<i<<endl;
}

vector<int> vec;
......
for(auto elem : vec)
{
	cout<<elem<<endl;
}

auto:自动变量,这个变量的类型由编译器自动推导,这里auto代表的就是int类型
从vec中取出数据,放到auto 变量elem中,打印elem


//引用类型
for(auto &elem : vec)
{
	elem*=3;
}

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

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

C++11中
list<int> 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 + 大根堆(最大的排在堆顶,其他元素不用排序) 


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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值