1. STL六大组件
创始人
2024-03-17 10:59:48
0

0. 介绍

STL提供六大组件,它们之间可以彼此套用,如下图所示:

  1. 容器(containers):用于存放数据;
  2. 算法(algorithms):包含各种常用算法;
  3. 迭代器(iterators):处于容器和算法中间,算法通过迭代器获取到容器的数据,并对数据进行操作;
  4. 仿函数(functors):行为类似函数,协助算法完成不同策略变化;
  5. 适配器(adapters):一种用来修饰容器、仿函数或者迭代器接口的东西;
  6. 配置器(allocators):负责底层动态空间配置、空间管理和空间释放;

1. 六大组件的使用

通过下面简单的程序,展示了六大组件的使用,具体内容如下:

  1. 定义了一个vector对象;
  2. 使用allocator为vector对象管理内存;
  3. begin和end返回迭代器,作为算法的输入;
  4. 使用count_if算法;
  5. 仿函数less
  6. not1和bind2nd为functor的adaptor

#include 
#include 
#include 
#include using namespace std;int main()
{int ia[6] = {27, 210, 12, 47, 109, 83};vector> vi(ia, ia+6);// bind2nd(less(), 40): 元素小于40的值cout << count_if(vi.begin(), vi.end(),not1(bind2nd(less(), 40))) << endl;        // 4return 0;
}

2. 令人困惑的C++语法

在STL中,有些日常开发过程中不常见、令人困惑的C++语法,如template 特化和偏特化、临时对象或者function call操作符等等。

2.1 迭代器的前闭后开区间表示法

一对迭代器标示的区间是一个前闭后开的区间,也即[fisrst, last),整个实际范围从first开始,知道last-1结束。迭代器last所指的是“最后一个元素的下一位置“。

2.2 临时对象的产生和使用

临时对象,也称无名对象(unnamed objects),通过在template类名称之间直接加上一个小括号,并可指定初值,其意义相当于调用相应的构造函数constructor,且不指定对象名称。

template 
class print
{
private:T text;
public:print() {};print(T elem) : text(elem) {};void operator() (){cout << text << endl;}
};
int main()
{print obj1 ;   obj1();    print obj2(10);obj2();// unnamed objectsprint() ();     // 前一个()是用来得到临时对象, 后一个()是用来调用operator()操作print(20) ();return 0;
}

2.3 template类的特化和偏特化

template特化指的是模板参数在特定类型下的具体实现,即将模型中的参数类型转换为特定(具体)的参数类型。

偏特化(partial specialization)是模板特化的一种特殊形式。一般来说,特征也称他为全特化,即将所有的模板参数替换为具体参数类型,而偏特化是将部分参数类型转换为特定类型。

3. 容器的结构

3.1 序列式容器

序列式容器指的是,以线性排列方式(内存地址连续)来存储某一特定类型的数据,包括array、vector、list、forward_list和deque五种。

array

如下图所示,array容器的大小,在容器创建之后是固定不变的,即不能增加或者删除元素,只能修改元素值。

特性如下:

vector

vector容器是一个长度可变的容器,即在存储空间不足时,会通过allocator自动申请更多的空间。

特性如下:

list

list容器,以双向链表方式组织元素,支持高效地删除和插入操作,但访问元素,需要遍历整个链表,直到找到目标元素。

特性如下:

forward_list

forward_list容器,以单链表的形式组织元素,是一类比list容器快、更节省空间的容器。

deque

deque容器可以进行双向扩充,首尾都可以高效插入和删除元素。

3.2 关联式容器

与序列式容器不同,关联式容器在存储元素时会为每个元素都配备一个key,key和元素data以键值对的方式存储到容器中。关联式容器可以通过key找到对应的元素,且存储元素时,默认会根据各元素key的大小做升序排序,因此,关联式容器在查找、访问、插入和删除指定元素的效率更高。

map和multi_map

map和multi_map的底层实现是RB-tree,其中每个key都对应一个data,且在map中key值是独一无二的,使用multi_map时意味着key值可以重复。

map的特性如下:

multi_map的特性如下:

set和multi_set

set和multi_set的底层实现同样是RB-tree,且要求key和value值必须相等。

set的特性如下:

unordered_map和unordered_multimap(无序)

unordered_map和unordered_multimap的底层实现是哈希表,也采用键值对的方式存储数据,且键值对是无序的,擅长通过键查找对应值,但是使用迭代器遍历容器中的元素效率不高。

unordered_set和unordered_multiset(无序)

unordered_set和unordered_multiset容器的底层实现也是哈希表,即键值对是无序的,且key值等于value值。

 至此,完成了对C++的STL简单介绍,后续将对六大组件进行详细描述。

相关内容

热门资讯

【2025年度消费避坑图鉴】保... 央广网北京12月26日消息(记者白德彰)在本期《年度消费避坑图鉴》中,我们聚焦保险领域。尽管投诉占比...
动态要闻 | 珠海市律师协会涉... 【珠海律师、珠海法律咨询、珠海律师事务所、京师律所、京师珠海律所】 12月24日,珠海市律师协会涉外...
律师最难跟客户说出的一句话:赢... 律师代理案件,最开心的时候莫过于通过律师与客户的共同配合,不但赢得官司,客户还成功拿到钱。 对于有些...
原创 欧... 12月23日,据观察者网报道,俄罗斯副外长谢尔盖表示,虽然俄罗斯跟北约存在冲突风险但他们愿意以法律形...
东京通胀降温,加息难停?日元陷... 日本总务省公布的数据显示,东京12月核心CPI同比上涨2.3%,超预期降温。 周五,日本股市开盘走高...
专业文章丨跨境模具纠纷高效和解... 【珠海律师、珠海法律咨询、珠海律师事务所、京师律所、京师珠海律所】 (本文转载自北京市京师律师事务所...
全总等三部门联合发布2025年... 新华社北京12月25日电(记者樊曦、冯家顺)记者12月25日从全国总工会了解到,全国总工会与最高人民...
对“问题法规”要及时纠正 从事网约车经营要求车辆购置总价不得低于12万元、残疾人机动轮椅车登记需有本市常住户籍……日前提请全国...
专业文章丨相对不起诉:一起交通... 【珠海律师、珠海法律咨询、珠海律师事务所、京师律所、京师珠海律所】 (本文转载自北京市京师郑州律师事...