C++STL学习笔记 迭代器、算法、容器之间的关系

 一、STL中的算法

1、STL中的算法会对容器中的数据进行处理,但是算法与容器的数据之间并没有直接联系,而是通过迭代器作为中间层,使得算法能处理容器中的数据。

2、各种容器中,迭代器的分类

目前有5中迭代器类型

(1)输入迭代器

struct input_iterator_tag{};

(2)输出迭代器

struct output_iterator_tag{};

(3)单向链表迭代器

struct forward_iterator_tag : public input_iterator_tag{};

(4)双向链表迭代器

struct bidirectional_iterator_tag : public forward_iterator_tag{};

(5)随机访问迭代器

struct random_access_iterator_tag : public didirectional_iterator_tag{};
 

3、各个容器使用迭代器分析

序列型容器

(1)Array:是一个固定大小的数组,在一块连续的内存中,一次可以根据索引随机跳转到任意位置,因此使用的是随机访问迭代器(random_access_iterator_tag)。

(2)Vector:是一个动态的数组,在一块连续的内存中,也可以随机跳转的任意位置,因此使用的是随机访问迭代器(random_access_iterator_tag)。

(3)Deque:是分段连续存储的,但是给使用者一个假象,让使用者感觉是连续的,内部实现做了连续性处理,因此使用的是随机访问迭代器(random_access_iterator_tag)。

(4)List:是双向链表,每一个结点都是一块单独的内存,通过每一个结点的指针指向下一个结点,因此内存是不连续的,所以使用的是双向链表迭代器(bidirectional_iterator_tag)。

(5)Forward_List:单项链表,与双向链表类似,因此使用的是单向链表迭代器(forward_iterator_tag)。

关联型容器

(1)set/multiset/map/multimap

因为其底层使用的红黑树,而红黑树每个结点直接的关系是通过双向链表索引的,因此使用的是双向链表迭代器(bidirectional_iterator_tag)。

(2)unordered_set/unordered_multiset/unordered_map/unordered_multimap

因为其底层结构使用的hash_table,而hash_table中的每个篮子使用的是双向链表,或者是单向链表,因此根据不同平台对标准库处理的不同,可以分为使用双向链表迭代器(bidirectional_iterator_tag)或者使用单向链表迭代器(forward_iterator_tag)。

4、容器所使用迭代器测试代码

测试结果如下:

从结果可以看出来,VS下的容器unordered_set/unordered_multiset/unordered_map/unordered_multimap的底层hash_table,每个篮子所采用的的是双向链表。

5、istream_iterator的iterator_category

不论那个版本的istream_iterator都在定义自己的迭代器类型,即input_iterator_tag。

6、ostream_iterator的iterator_category

7、iterator_category对算法的影响

8、iterator_category和type traits对算法的影响

copy函数

destroy函数

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++11STL中常用的迭代器算法有以下几个,分别是: 1. copy:将一个序列复制到另一个序列中。 2. reverse:将一个序列翻转。 3. sort:对一个序列进行排序。 4. unique:去除一个序列中的重复元素。 下面对每个算法进行详细介绍: 1. copy copy函数用于将一个序列复制到另一个序列中。其函数原型如下: ```c++ template <class InputIterator, class OutputIterator> OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result); ``` 其中,first和last分别表示被复制序列的起始位置和结束位置(注意,end位置并不包括在序列内),result表示将要复制到的序列的起始位置。 例如,如果有两个整数数组a和b,我们想要将a中的元素复制到b中,可以这样写: ```c++ int a[] = {1, 2, 3, 4, 5}; int b[5]; copy(a, a + 5, b); ``` 这里,a和a+5分别表示数组a的起始位置和结束位置,b表示数组b的起始位置。复制后,数组b的内容为:{1, 2, 3, 4, 5}。 2. reverse reverse函数用于将一个序列翻转。其函数原型如下: ```c++ template <class BidirectionalIterator> void reverse(BidirectionalIterator first, BidirectionalIterator last); ``` 其中,first和last分别表示序列的起始位置和结束位置(注意,end位置并不包括在序列内)。 例如,如果有一个整数数组a,我们想要将其翻转,可以这样写: ```c++ int a[] = {1, 2, 3, 4, 5}; reverse(a, a + 5); ``` 这里,a和a+5分别表示数组的起始位置和结束位置。翻转后,数组a的内容为:{5, 4, 3, 2, 1}。 3. sort sort函数用于对一个序列进行排序。其函数原型如下: ```c++ template <class RandomAccessIterator> void sort(RandomAccessIterator first, RandomAccessIterator last); ``` 其中,first和last分别表示序列的起始位置和结束位置(注意,end位置并不包括在序列内)。该函数只能用于随机访问迭代器。 例如,如果有一个整数数组a,我们想要将其排序,可以这样写: ```c++ int a[] = {5, 3, 1, 4, 2}; sort(a, a + 5); ``` 这里,a和a+5分别表示数组的起始位置和结束位置。排序后,数组a的内容为:{1, 2, 3, 4, 5}。 4. unique unique函数用于去除一个序列中的重复元素。其函数原型如下: ```c++ template <class ForwardIterator> ForwardIterator unique(ForwardIterator first, ForwardIterator last); ``` 其中,first和last分别表示序列的起始位置和结束位置(注意,end位置并不包括在序列内)。该函数只能用于前向迭代器。 例如,如果有一个整数数组a,其中有重复元素,我们想要去除重复元素,可以这样写: ```c++ int a[] = {1, 2, 2, 3, 3, 3, 4, 5, 5}; int* p = unique(a, a + 9); ``` 这里,a和a+9分别表示数组的起始位置和结束位置。去重后,数组a的前p-a个元素是不重复的,p之后的元素是无用的。这里,p指向的位置是a+5,即数组a的前5个元素是不重复的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值