目录
1、std::iterator 的定义和作用
(1)std::iterator 是 C++ STL 中的一个概念,是一个迭代器抽象类,用于定义容器类的迭代器类型。它是一个模板类,定义了一组迭代器的基本操作,包括解引用、前进、后退、比较等
(2)std::iterator的作用:是为了让用户定义自己的迭代器时,能够遵循一定的规则和标准,使得这些自定义的迭代器能够和标准库中的算法和容器无缝衔接。用户可以通过继承std::iterator来定义自己的迭代器,从而使得自己的迭代器具有标准库迭代器的特性和功能。
2、std::iterator常用的api
std::iterator是一个模板类,用于定义迭代器的基本特性,它没有具体的成员函数,但是提供了以下常用的类型定义:
(1)iterator_category:迭代器的类型,可以是std::input_iterator_tag、std::output_iterator_tag、std::forward_iterator_tag、std::bidirectional_iterator_tag或std::random_access_iterator_tag之一。
(2)value_type:迭代器指向的元素类型。
(3)difference_type:迭代器之间的距离类型。
(4)pointer:迭代器指向元素的指针类型。
(5)reference:迭代器指向元素的引用类型。
这些操作是为了让迭代器能够被标准库算法使用,以及能够与其他迭代器进行比较和操作。用户定义的迭代器应该继承自std::iterator,并重载这些基本操作。
常用的操作有:
#include <iterator>
1. next():返回迭代器中的下一个元素。
2. prev():返回迭代器中的上一个元素。
3. size():返回容器或者数组的大小
4. advance():给定迭代器前进的距离
5. distance():返回两个迭代器间的距离
6. begin():返回指向容器或者数组起始的迭代器
7. end():返回指向容器或者数组结尾的迭代器
8. empty():检查容器是否为空;
3、std::iterator 迭代器的种类
C++标准库中的std::iterator是一个抽象基类,它定义了一些成员函数,用于支持迭代器的操作。它有五种种类:
(1)input_iterator:只能读取迭代器指向的值一次,不支持随机访问。
(2)output_iterator:只能写入迭代器指向的值一次,不支持随机访问。
(3)forward_iterator:支持单向迭代,可以读取和写入迭代器指向的值,但不支持随机访问。
(4)bidirectional_iterator:支持双向迭代,可以向前和向后遍历迭代器指向的元素,但不支持随机访问。
(5)random_access_iterator:支持随机访问,可以读取和写入迭代器指向的值,可以进行任意跳跃。
4、std::iterator迭代器的使用
使用迭代器的步骤如下:
(1)定义迭代器变量:通过容器的 begin() 或 end() 函数来获取迭代器对象,begin() 函数返回容器的第一个元素的迭代器,end() 函数返回容器的最后一个元素的下一个位置的迭代器。
(2)遍历容器:使用迭代器变量来访问容器中的元素,可以使用 ++ 运算符来移动迭代器,并访问容器中的下一个元素。
下面是一个使用迭代器遍历 vector 的例子:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec = {1, 2, 3, 4, 5};
// 使用迭代器遍历 vector
vector<int>::iterator it;
for (it = vec.begin(); it != vec.end(); ++it)
{
cout << *it << " ";
}
return 0;
}
在上面的例子中,我们定义了一个 vector 对象 vec,并使用迭代器遍历了它的所有元素。注意,迭代器变量 it 的类型是 vector<int>::iterator,这是因为 vector 类型的迭代器需要使用 vector<int>::iterator 类型。在循环中,我们使用 ++it 运算符来移动迭代器并访问容器中的下一个元素,使用 *it 运算符来获取迭代器指向的元素的值。
除了使用迭代器访问 vector 外,我们还可以使用迭代器访问其他容器,例如 list、set、map 等。只需要将迭代器类型替换为相应容器的迭代器类型即可。
5、std::iterator 迭代器的适配器
迭代器的适配器是一种用于改变迭代器行为的工具。
它们可以将一个迭代器转换为另一种迭代器类型或者对原始迭代器进行修改,以便更好地满足特定的需求。
常见的迭代器适配器包括:
(1)插入迭代器:将迭代器的赋值操作转换为插入操作,可以用于向容器中插入元素。
(2)反向迭代器:将迭代器的遍历顺序反转,可以用于从容器的末尾开始遍历。
(3)流迭代器:将迭代器与输入输出流连接,可以用于从文件或标准输入输出流中读取或写入数据。
使用迭代器适配器的步骤如下:
(1)包含适配器头文件。
(2)创建适配器对象,并将原始迭代器作为参数传递给适配器对象的构造函数。
(3)使用适配器对象进行迭代操作。
例如,使用插入迭代器将元素插入到vector容器中的示例代码如下:
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
int main()
{
vector<int> v = {1, 2, 3, 4, 5};
vector<int> v2;
// 创建插入迭代器
back_insert_iterator<vector<int>> inserter(v2);
// 使用插入迭代器将元素插入到v2中
copy(v.begin(), v.end(), inserter);
// 输出v2中的元素
for (auto i : v2)
cout << i << " ";
return 0;
}