几个关于C++的几个学习网站:
http://www.cplusplus.com
https://en.cppreference.com
http://gcc.gnu.org
- 容器(Containers)
- 分配器(Allocators)
- 算法(Algorithms)
- 迭代器(Iterators)
- 适配器(Adapters)
- 仿函数(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 + 大根堆(最大的排在堆顶,其他元素不用排序)
文章中图片来源于网络,侵联删。