7. 迭代器
7.2 迭代器分类
7.2.1 输入迭代器(Input Iterator)
输入迭代器只能逐位向前读取元素,且只能读取一遍,例如:istream,,ifstream。
7.2.2 输出迭代器(Output Iterator)
它与输入迭代器正好相反,它只能逐位向前写元素,也只能写一遍,例如:ostream,ofstream,inserter。
7.2.3 前向迭代器(Forward Iterator)
它是输出迭代器和输入迭代器的组合,它拥有输入迭代器的所有能力和几乎所有的输出迭代器的能力
7.2.4 双向迭代器(Bidirectional Iterator)
双向迭代器是前向迭代器加上向后迭代的能力,它的移动操作只有++和--,例如:list,set,multiset,map,multimap提供的迭代器。
7.2.5 随机访问迭代器(Random Access Iterator)
它可以随机存取元素,并且迭代器可以做算数运算,和关系运算(< 和 >)。例如:vector,deque,string,array提供的迭代器。
7.2.5 vector string迭代器的递增递减操作的问题
由于vector和string的迭代器通常用元素类型的指针来实现,对于指针你又不能改变它的临时值,因此很多情况下,编译会通不过。这时你需要一个临时的迭代器,例如:
std::vector<int> coll;
...
//sort, starting with the second element
// - PORTABLE version
if (coll.size() > 1) {
std::vector<int>::iterator beg = coll.begin();
coll.sort (++beg, coll.end());
}
7.3 迭代器辅助函数
#include <iterator> //头文件
void advance(InputIterator& pos, Dist n); //将迭代器向前移动n个位置,对所有迭代器适用。
Dist distance(InputIterator pos1, InputIterator pos2); //计算两个迭代器之间的距离,对所有迭代器适用。
#include <algorithm> //头文件
void iter_swap (ForwardIterator1 pos1, ForwardIterator2 pos2);//交换两个迭代器的值,两个迭代器不需要为同一类型,但是必须可以复制。
7.4 迭代器适配器(Iterator Adapters)
7.4.1 反向迭代器(reverse iterator)
反向迭代器可以以相反的顺序访问元素。容器的rbegin()和rend()返回一对反向迭代器。
Container<T>::reverse_iterator rpos(pos);可以获得pos的反向迭代器,但rpos的值指向pos的前一个位置。
可以用reverse_iterator.base();得到反向迭代器的正向迭代器。
例子:
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
vector<int> ivec;
for (int i = 1; i < 9; ++i)
{
ivec.push_back(i);
}
vector<int>::iterator pos;
pos = find(ivec.begin(), ivec.end(), 5);
if (pos != ivec.end())
{
cout << "pos=" << *pos << endl;
}
vector<int>::reverse_iterator rpos(pos);
cout << "rpos=" << *rpos << endl;
vector<int>::iterator pos2 = find(ivec.begin(), ivec.end(), 2);
vector<int>::iterator pos7 = find(ivec.begin(),ivec.end(), 7);
copy(pos2,pos7, ostream_iterator<int>(cout));
cout << endl;
vector<int>::reverse_iterator rpos2(pos2);
vector<int>::reverse_iterator rpos7(pos7);
copy(rpos7, rpos2, ostream_iterator<int>(cout));
cout << endl;
vector<int>::iterator rrpos2 = rpos2.base();
cout << "rrpos2=" << *rrpos2 << endl;
getchar();
return 0;
}
输出:
pos=5
rpos=4
23456
65432
rrpos2=2
7.4.2 输入迭代器(Insert iterators)
输出迭代器主要用于算法,它使得算法可以将新值插入容器而不是覆盖,它将覆盖操作转换为插入操作。输入迭代器重载了解引用操作符(*)返回自身容器的一个引用,和赋值操作符(=),把它转化为容器的push_back,push_front或insert操作。
有三种输入迭代器:back_inserter,front_inserter和insertor,分别对应push_back,push_front和insert操作。
7.4.3 流迭代器(Stream Iterators)
流迭代器是一个迭代器适配器,它让你能用流作为算法的输入和输出源。
输出流迭代器(Ostream Iterators)
ostream_iterator<T>(ostream, delim=’’);
输入流迭代器(Istream Iterators)
istream_iterator<T>(),流输入迭代器的结束;
istream_iterator<T>(istream),创建一个istream的迭代器。
7.5 迭代器特征(Iterator Traits)
每一个迭代器都有对应的Iterator tag,标准库的定义:
namespace std {
struct output_iterator_tag {
};
struct input_iterator_tag {
};
struct forward_iterator_tag
: public input_iterator_tag {
};
struct bidirectional_iterator_tag
: public forward_iterator_tag {
};
struct random_access_iterator_tag
: public bidirectional_iterator_tag {
};
}
Iterator Traits,它包含了迭代器相关的类型定义,使得你可以作为泛型编程的引用。
标准库的定义:
namespace std {
template <class T>
struct iterator_traits {
typedef typename T::value_type value_type;
typedef typename T::difference_type difference_type;
typedef typename T::iterator_category iterator_category;
typedef typename T::pointer pointer;
typedef typename T::reference reference;
};
}
namespace std {
template <class T>
struct iterator_traits<T*> {
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef random_access_iterator_tag iterator_category;
typedef T* pointer;
typedef T& reference;
};
}
分享到:
相关推荐
C++ Standard Template Library (STL) 是C++编程语言中不可或缺的一部分,它提供了一组高效、可重用的容器、迭代器、算法和函数对象。STL的核心思想是泛型编程,即通过模板来实现代码的复用,使得开发者可以处理不同...
《Visual C++程序设计学习笔记》是一份深入探讨VC++编程技术的综合资料,涵盖了从基础知识到实际系统开发的广泛内容。Visual C++是Microsoft公司推出的一种强大的集成开发环境,它集成了C++编译器、调试器以及MFC...
《Visual C++程序设计学习笔记》是一份深入探讨C++编程在Microsoft Visual Studio环境下的实践指南。这份笔记涵盖了从基础知识到高级技术的广泛内容,旨在帮助读者熟练掌握Visual C++的使用,提升软件开发能力。 一...
《王道C++46期学习笔记记录》是一份详细且深入的C++学习资源,旨在帮助编程初学者以及有经验的开发者进一步提升C++技能。C++是一种强大的、通用的编程语言,以其面向对象的特性、高效性能和丰富的库支持而闻名。这46...
STL(Standard Template Library,标准模板库)是C++编程语言中的一个重要组成部分,它提供了高效且灵活的数据结构和算法。这篇学习笔记将深入探讨STL的核心概念、主要组件以及其在实际编程中的应用。 首先,STL的...
《C++程序设计学习笔记》是一份深入探讨C++编程技术的资料,旨在帮助学习者掌握C++语言的核心概念和编程技巧。这份笔记基于C++程序设计特别版,集成了作者在学习过程中的精华理解和实践心得,对于初学者和有一定经验...
《C++学习笔记经典(与C比较)》这份资料应该会详细讲解这些知识点,并通过实例来帮助读者深入理解C++与C的差异,以及如何在实际编程中应用C++的特性和功能。这份资料可能会涵盖基本语法、类和对象、模板、STL的使用...
C++ Standard Template Library(STL)是C++编程语言的一个重要组件,它提供了一系列通用的数据结构和算法模板,使程序员能够以一种标准化和高效的方式处理数据。STL的主要组成部分包括容器(containers)、迭代器...
- **STL(Standard Template Library)**:深入理解容器、迭代器、算法的使用,以及自定义比较函数和迭代器适配器。 在学习过程中,不断实践和编写代码是巩固知识的关键。通过编写小程序、解决实际问题来加深对C++...
《达内学生C++学习笔记》是一份专为初学者设计的C++教程,旨在提供清晰易懂、逐步深入的学习路径。这份笔记涵盖了C++语言的基础到进阶内容,是学习C++的理想辅助资料。 首先,C++是一种静态类型的、编译式的、通用...
本篇学习笔记主要涵盖了前三章的内容,重点关注STL(Standard Template Library,标准模板库)中的容器、特别是vector的使用,以及迭代器的概念。接下来我们将详细探讨这些知识点。 首先,STL是一个强大的工具集,...
《C++学习笔记》是一部非常实用的资源,适合那些对C++编程语言有着浓厚兴趣或者正在学习C++的初学者。这份笔记详细介绍了C++语言的基础知识、核心概念以及高级特性,旨在帮助读者掌握C++编程的核心技能。 C++是...
5. **STL(Standard Template Library)**:STL是C++的标准库,包含容器(如vector、list、set等)、迭代器、算法和函数对象,为程序员提供了高效的数据结构和算法。 6. **异常处理**:C++提供了异常处理机制,通过...
10. **STL(Standard Template Library)**:STL是一组通用的C++模板类和函数,包括容器、迭代器、算法和函数对象,它极大地提高了代码的效率和可读性。 11. **I/O流**:C++的I/O流库使得输入输出操作更加直观和...
C++ SLS(Standard Library Style Guidelines)是一组用于编写C++标准库的编码规范,旨在提供高质量、统一的代码风格。这些指南对于任何参与C++编程,尤其是进行课程设计或大型项目开发的人来说都是极其重要的。以下...
本学习笔记将深入探讨C++的基础、核心概念以及高级特性,帮助读者从初学者到熟练掌握C++。 一、C++基础 C++的基础包括基本语法、数据类型、变量、运算符、流程控制(如if语句、switch语句、for循环、while循环)和...
这个“C & C++学习笔记集合”显然是一份综合性的资源,旨在帮助学习者深入理解和掌握这两种语言。 C 语言是基础,它的语法简洁明了,对内存管理有直接的控制,是理解计算机底层工作原理的良好起点。C 语言的核心...
6. **STL(Standard Template Library)标准库**:C++的STL包含容器(如vector、list、set等)、迭代器、算法和函数对象。熟练使用STL可以提高代码效率,简化编程任务。 7. **异常处理**:C++的异常处理机制允许...
12. **STL(Standard Template Library)**:STL是C++标准库的一部分,包含了容器(如vector、list、map等)、算法和迭代器,极大地提高了编程效率。 学习C-C++的基础,不仅需要理解和掌握上述知识点,还需要通过...
2. **类模板**:类模板可以生成处理不同类型数据的类,提供了泛型数据结构和算法,如STL(Standard Template Library)中的容器(vector、list、set等)和算法(sort、find等)。 【异常处理】 C++提供了一种处理...