C++ 中不同类型的基于范围的 for 循环迭代器
C++ 中的基于范围的 for 循环是一个非常方便的语言特性,它可以遍历容器或者其他可迭代对象中的所有元素。然而,使用基于范围的 for 循环需要使用迭代器来进行底层遍历操作。本文将介绍 C++ 中不同类型的基于范围的 for 循环迭代器,并提供示例代码来演示如何使用它们。
1. 针对数组的迭代器
在 C++ 中,可以使用范围 for 循环来迭代数组中的元素。为了支持这一特性,需要使用 C++11 引入的 begin
和 end
函数,它们用于获取指向数组开头和结尾的指针。然后我们可以通过指针来遍历数组中的元素。
#include <iostream>
int main() {
int arr[] = {1, 2, 3, 4, 5};
for (auto& x : arr) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}
在上面的代码中,我们可以使用 auto& x
来捕获数组中的每个元素,然后输出它们的值。
2. 针对容器的迭代器
除了数组之外,C++ 中的迭代器还包括指向容器元素的迭代器。对于标准库容器,我们可以使用它们的 begin
和 end
函数来获取迭代器,例如:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec{1, 2, 3, 4, 5};
for (auto& x : vec) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}
在上面的例子中,我们使用了 std::vector<int>
容器,并使用 auto& x
来遍历容器中的每个元素。可以看到,输出结果与遍历数组的结果相同。
需要注意的是,对于一些非标准库容器或者自定义容器,可能需要手动实现它们的 begin
和 end
函数,以便支持基于范围的 for 循环迭代器。
3. 针对字符串的迭代器
C++ 中的字符串也是可迭代的对象,我们可以使用基于范围的 for 循环来遍历字符串中的每个字符。对于字符串对象,也可以使用 begin
和 end
函数来获取对应的迭代器。
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, world!";
for (auto& c : str) {
std::cout << c;
}
std::cout << std::endl;
return 0;
}
在上面的代码中,我们使用了标准库的 std::string
类型,并通过 auto& c
来遍历字符串中的每个字符。
4. range-v3 库中的迭代器
C++20 中引入了一系列与范围有关的语言特性,其中最重要的就是范围库 range-v3。这个库提供了一系列方便的工具函数和数据类型,可以大大简化基于范围的操作。
对于迭代器的支持,range-v3 库中提供了 ranges::begin
和 ranges::end
函数,用于获取任何可遍历对象的起始和结尾迭代器。
#include <iostream>
#include <vector>
#include <range/v3/all.hpp>
int main() {
std::vector<int> vec{1, 2,3, 4, 5};
for (auto& x : ranges::views::all(vec)) {
std::cout << x << " ";
}
std::cout << std::endl;
return 0;
}
在上面的代码中,我们使用 range-v3 库的 ranges::views::all
函数来将容器视为一个范围,从而避免使用 begin
和 end
函数。
5. 其他特殊迭代器类型
除了上述常用迭代器类型外,C++ 中还有一些特殊的迭代器类型,例如反向迭代器、插入迭代器、流迭代器等等。
例如,反向迭代器可以用于实现逆序遍历容器:
#include <iostream>
#include <vector>
#include <iterator>
int main() {
std::vector<int> vec{1, 2, 3, 4, 5};
for (auto it = vec.rbegin(); it != vec.rend(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
在上面的代码中,我们使用了 std::vector<int>
的反向迭代器,可以通过 rbegin()
和 rend()
函数获取。
还有其他的特殊迭代器类型可以用于实现一些特殊的操作,读者可以自行查阅资料来深入了解。
结论
基于范围的 for 循环是 C++ 中非常方便的一个语言特性,可以让我们遍历容器和其他可迭代对象的所有元素。在遍历时,不同类型的迭代器具有一些特定的用法和注意点,例如数组和容器需要使用不同的函数获取迭代器。遵循这些注意点可以让我们更加方便和高效地使用基于范围的 for 循环。