迭代器是一种可以访问和遍历容器中元素的对象,它类似于指针,但是具有更多的功能和灵活性。本文将介绍C++迭代器的基本概念、分类、用法和注意事项。
迭代器(iterator)是一种抽象的数据类型,它可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。迭代器相当于容器和操作容器的算法之间的桥梁,使得算法可以适用于不同类型的容器。
迭代器的用法类似于指针,可以使用 * 运算符来解引用迭代器,获取它指向的元素的值或引用。也可以使用 ++ 和 – 运算符来移动迭代器的位置,使其指向容器中的前一个或后一个元素。另外,还可以使用 == 和 != 运算符来比较两个迭代器是否相等或不等,即是否指向同一个元素。
C++标准库中定义了五种类型的迭代器,它们分别是:
不同类型的迭代器具有不同的功能和限制,它们之间存在包含关系。例如随机访问迭代器是最强大的一种迭代器,它包含了其他所有类型迭代器的功能。反之,输出迭代器是最弱的一种迭代器,它只能执行最基本的操作。
不同类型的容器提供了不同类型的迭代器,如下表所示:
容器 | 迭代器类型 |
---|---|
vector | 随机访问 |
deque | 随机访问 |
list | 双向 |
forward_list | 前向 |
set/multiset | 双向 |
map/multimap | 双向 |
unordered_set/unordered_multiset | 前向 |
unordered_map/unordered_multimap | 前向 |
stack | 不支持 |
queue | 不支持 |
priority_queue | 不支持 |
从表中可以看出,顺序容器(vector、deque、list、forward_list)提供了随机访问、双向或前向三种类型的迭代器;关联容器(set/multiset、map/multimap)提供了双向类型的迭代器;无序关联容器(unordered_set/unordered_multiset、unordered_map/unordered_multimap)提供了前向类型的迭代器;容器适配器(stack、queue、priority_queue)不支持迭代器。
要使用一个容器的迭代器,首先需要定义一个迭代器变量,其一般形式为:
容器类型::iterator 迭代器名;
例如,要定义一个 vector 容器的迭代器,可以写为:
vector<int>::iterator it;
也可以使用 auto 关键字来自动推断迭代器的类型,如:
auto it = v.begin(); // v 是一个 vector 容器
要获取一个容器的迭代器,可以使用容器的成员函数 begin() 和 end(),它们分别返回指向容器第一个元素和最后一个元素之后位置的迭代器。例如:
vector<int> v = {1, 2, 3, 4, 5};
auto it1 = v.begin(); // it1 指向 v 的第一个元素,即 1
auto it2 = v.end(); // it2 指向 v 的最后一个元素之后的位置,即 5 的后面
也可以使用全局函数 std::begin()
和 std::end()
来获取容器的迭代器,它们的功能和成员函数相同。例如:
vector<int> v = {1, 2, 3, 4, 5};
auto it1 = std::begin(v); // it1 指向 v 的第一个元素,即 1
auto it2 = std::end(v); // it2 指向 v 的最后一个元素之后的位置,即 5 的后面
要访问迭代器指向的元素,可以使用 * 运算符来解引用迭代器,获取它指向的元素的值或引用。例如:
vector<int> v = {1, 2, 3, 4, 5};
auto it = v.begin(); // it 指向 v 的第一个元素,即 1
cout << *it << endl; // 输出 1
*it = 10; // 修改 it 指向的元素的值为 10
cout << *it << endl; // 输出 10
要移动迭代器的位置,可以使用 ++ 和 – 运算符来使迭代器指向容器中的前一个或后一个元素。注意,只有双向或随机访问类型的迭代器才支持 – 运算符。例如:
vector<int> v = {1, 2, 3, 4, 5};
auto it = v.begin(); // it 指向 v 的第一个元素,即 1
++it; // it 指向 v 的第二个元素,即 2
--it; // it 指向 v 的第一个元素,即 1
it++; // it 指向 v 的第二个元素,即 2
it--; // it 指向 v 的第一个元素,即 1
要比较两个迭代器是否相等或不等,可以使用 == 和 != 运算符。如果两个迭代器指向同一个容器中的同一个元素,则它们相等;否则,它们不等。例如:
vector<int> v = {1, 2, 3, 4, 5};
auto it1 = v.begin(); // it1 指向 v 的第一个元素,即 1
auto it2 = v.begin(); // it2 指向 v 的第一个元素,即 1
cout << (it1 == it2) << endl; // 输出 true
++it2; // it2 指向 v 的第二个元素,即 2
cout << (it1 == it2) << endl; // 输出 false
对于随机访问类型的迭代器,还可以使用 +、-、+=、-=、[] 等运算符来随机访问任意位置的元素。例如:
vector<int> v = {1, 2, 3, 4, 5};
auto it = v.begin(); // it 指向 v 的第一个元素,即 1
it += 3; // it 指向 v 的第四个元素,即 4
了解了上面的迭代器基本操作后,就可以对容器进行遍历。例如:
vector<int> v = {1, 2, 3, 4, 5};
auto it = v.begin(); // it 指向 v 的第一个元素,即 1
while(it != v.end())
{
cout<<*it<<" ";
it++;
}
cout<<endl;
本篇文章简要介绍了STL六大组件之一的迭代器(iterator)的基本用法,希望对大家有所帮助。