目录
4. 双向迭代器(Bidirectional Iterator)
5. 随机访问迭代器(Random Access Iterator)
摘要
在 C++ 中,迭代器(iterator)是用于遍历容器(如数组、链表、向量等)元素的对象。标准库(STL)中迭代器是一个重要的概念,类似于指针,但功能更强大。
根据不同的功能和特性,迭代器大致可以分为以下几类:
迭代器类别
- 输入迭代器(Input Iterator)
- 输出迭代器(Output Iterator)
- 前向迭代器(Forward Iterator)
- 双向迭代器(Bidirectional Iterator)
- 随机访问迭代器(Random Access Iterator)
1. 输入迭代器(Input Iterator)
输入迭代器用于读取数据。它们支持只读访问,每个元素只能读取一次。
#include <iostream>
#include <vector>
#include <iterator>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int>::iterator it = vec.begin();
std::cout << "Using input iterator: ";
while (it != vec.end()) {
std::cout << *it << " ";
++it;
}
std::cout << std::endl;
return 0;
}
2. 输出迭代器(Output Iterator)
输出迭代器用于写入数据。它们支持只写访问,每个元素只能写入一次。
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main() {
std::vector<int> vec(5);
std::ostream_iterator<int> out_it(std::cout, " ");
for (int i = 0; i < 5; ++i) {
vec[i] = i + 1;
}
std::cout << "Using output iterator: ";
std::copy(vec.begin(), vec.end(), out_it);
std::cout << std::endl;
return 0;
}
3. 前向迭代器(Forward Iterator)
前向迭代器支持读写访问,并且可以多次遍历同一个元素,可以向前移动。
#include <iostream>
#include <forward_list>
int main() {
std::forward_list<int> flist = {1, 2, 3, 4, 5};
std::forward_list<int>::iterator it;
std::cout << "Using forward iterator: ";
for (it = flist.begin(); it != flist.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
4. 双向迭代器(Bidirectional Iterator)
双向迭代器支持读写访问,可以向前和向后移动。
#include <iostream>
#include <list>
int main() {
std::list<int> lst = {1, 2, 3, 4, 5};
std::list<int>::iterator it;
std::cout << "Using bidirectional iterator (forward): ";
for (it = lst.begin(); it != lst.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
std::cout << "Using bidirectional iterator (backward): ";
for (it = lst.end(); it != lst.begin();) {
--it;
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
5. 随机访问迭代器(Random Access Iterator)
随机访问迭代器支持读写访问,并且可以以常数时间进行任意跳转,提供了类似指针的算术运算功能。
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int>::iterator it = vec.begin();
std::cout << "Using random access iterator: ";
for (size_t i = 0; i < vec.size(); ++i) {
std::cout << *(it + i) << " ";
}
std::cout << std::endl;
std::cout << "Using random access iterator for arithmetic operations: ";
it += 2;
std::cout << *it << " ";
it -= 1;
std::cout << *it << std::endl;
return 0;
}
总结
1. 有效性:确保迭代器在使用过程中始终有效。例如,插入或删除元素后,某些容器的迭代器可能失效。
2. 边界检查:使用迭代器时,要注意不要超出容器的边界,否则可能会导致泄漏问题。
3. 类型匹配:使用合适的迭代器类型来匹配容器类型。
4. 算法和迭代器:STL 算法通常使用迭代器作为参数,确保传递的迭代器满足算法的要求。
在C++ 中,迭代器提供了一种通用的方式来遍历和操作容器中的元素。根据我们实际开发项目不同的需求,选择合适的迭代器可以更有效地进行数据操作和算法应用。