求STL容器的两个iterator的距离

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: iterator的用法可以被统一,但不同的底层容器实现其iterator的原理是不一样的。例如iterator++你可以理解为移动到容器的下一个元素,如果底层如果是数组,把索引值加一就行;如果底层是链表,就得执行类似于m_pCurrent = m_pCurrent->pNext;的操作。
什么是Iterator?
        iterator的概念源自于对遍历一个线性容器工具的抽象,即如何你能访问这个容器的某个元素。对于最简单的数组,当然可以用数组的索引值,因为数组是连续存放在内存中的;但对于链表,就必须用指针。除此之外,还有还有很多种数据结构需要提供一个方便的工具来访问其中的元素,方法有ID,关键字等等。为了统一所有的容器的这种工具的使用,一般提供一整套容器的开发者就会用一种方式来表示各种容器的访问工具。例如C++   STL就是使用iterator。MFC自己的容器使用position。C#和java也有自己的方法,但方法是不变的。   
        iterator的用法可以被统一,但不同的底层容器实现其iterator的原理是不一样的。例如iterator++你可以理解为移动到容器的下一个元素,如果底层如果是数组,把索引值加一就行;如果底层是链表,就得执行类似于m_pCurrent   =   m_pCurrent->pNext;的操作。因此每种容器都有自己的iterator实现方法。

Iterator的类型
1、Input Interator :只允许作为输入,也就是只读(Read Only)
2、Output Interator :只允许作为输出,也就是只写(Write Only)
3、Forward Interator :允许读写,但只能做前向移动
4、Bidirectional Interator :允许读写,可以做双向移动
5、Random Access Interator :允许读写,可以任意移动


实现Distance()
        由上可知,从容器特性来划分是具有两种iterator的,一种是线性容器的iterator(数组,vector等);一种是非线性容器的iterator(链表等),因此求两个容器的距离自然也是有两种方法的。

非线性容器:
None.gifint distance(InputIterator p1, InputIterator p2)
ExpandedBlockStart.gif {
InBlock.gif  size_t n = 0;
InBlock.gif  while ( p1 != p2 )
ExpandedSubBlockStart.gif  {
InBlock.gif     ++p1;
InBlock.gif     ++n;   
ExpandedSubBlockEnd.gif  }

InBlock.gif  return n;
ExpandedBlockEnd.gif}
 
None.gif


线性容器:
None.gif int distance(RandomAccessIterator p1, RandomAccessIterator p2)
ExpandedBlockStart.gif {
InBlock.gif return p2-p1;
ExpandedBlockEnd.gif}
 
None.gif


std::distance()实现了以上两种Iterator的算法,并根据传入的Iterator类型进行适配。 
具体可以参考侯捷翻译的《STL源码剖析》一书,当中有详细的讲解。
目录
相关文章
|
5天前
|
存储 设计模式 算法
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
11 1
|
11天前
|
存储 算法 C++
详解C++中的STL(标准模板库)容器
【4月更文挑战第30天】C++ STL容器包括序列容器(如`vector`、`list`、`deque`、`forward_list`、`array`和`string`)、关联容器(如`set`、`multiset`、`map`和`multimap`)和容器适配器(如`stack`、`queue`和`priority_queue`)。它们为动态数组、链表、栈、队列、集合和映射等数据结构提供了高效实现。选择合适的容器类型可优化性能,满足不同编程需求。
|
13天前
|
C++ 容器
STL—map容器
STL—map容器
|
17天前
|
存储 算法 程序员
C++从入门到精通:2.2.1标准库与STL容器算法深度解析
C++从入门到精通:2.2.1标准库与STL容器算法深度解析
|
25天前
|
C++ 容器
约瑟夫经典问题C++,STL容器queue解法
约瑟夫经典问题C++,STL容器queue解法
14 0
|
1月前
|
存储 C语言 C++
C++中STL常用容器(vector、deque、list、map、set)一文带你了解
C++中STL常用容器(vector、deque、list、map、set)一文带你了解
|
1月前
|
存储 算法 C++
C++容器STL相关面试问题
C++容器STL相关面试问题
|
2月前
|
存储 C++ 容器
C++之STL顺序容器
C++之STL顺序容器
|
2月前
|
存储 算法 数据处理
【C++ STL容器set 】set 容器的全方位解析
【C++ STL容器set 】set 容器的全方位解析
124 0
|
2月前
|
安全 算法 编译器
【C++ 泛型编程 进阶篇】深入探索 C++ STL 容器的嵌套类型:识别、运用与最佳实践
【C++ 泛型编程 进阶篇】深入探索 C++ STL 容器的嵌套类型:识别、运用与最佳实践
98 7