如何以函数式风格遍历二维vector?偏好使用.iter()方法实现
嘿,我太懂你想靠优雅的函数式风格遍历二维std::vector的心情了——之前我也踩过类似的坑,给你捋捋正确的打开方式:
首先得说清楚:C标准库的std::vector没有名为iter()的成员函数,你可能是混淆了其他语言(比如Python的iter()内置方法)的用法。C里获取迭代器的标准方式是.begin()和.end(),或者直接用range-based for循环(编译器会帮你自动处理迭代器)。
下面给你几种符合函数式风格的实现方案:
1. 最直观的Range-Based For循环
这是C++11以后最常用的“函数式感”遍历方式,不用手动管理迭代器,代码清爽到爆炸:
#include <vector> #include <iostream> int main() { std::vector<std::vector<int>> two_d_vec = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 嵌套遍历,全程不需要手动写迭代器 for (const auto& row : two_d_vec) { // 用const&避免不必要的拷贝,性能更好 for (const auto& elem : row) { std::cout << elem << " "; } std::cout << "\n"; } return 0; }
2. 结合<algorithm>的纯函数式遍历
如果你想把遍历逻辑和操作逻辑彻底分离,用std::for_each是绝佳选择——这是标准库提供的纯函数式遍历工具:
#include <vector> #include <algorithm> #include <iostream> int main() { std::vector<std::vector<int>> two_d_vec = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 外层遍历每一行 std::for_each(two_d_vec.begin(), two_d_vec.end(), [](const std::vector<int>& row) { // 内层遍历每行元素,用lambda封装操作逻辑 std::for_each(row.begin(), row.end(), [](int elem) { std::cout << elem << " "; }); std::cout << "\n"; }); return 0; }
3. C++20进阶:用Range库更简洁
如果你的编译器支持C++20,还可以用标准库的Range库,写法更简洁,甚至能直接把二维vector展平成一维遍历:
#include <vector> #include <ranges> #include <iostream> int main() { std::vector<std::vector<int>> two_d_vec = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 一键展平二维容器,直接遍历所有元素 for (int elem : two_d_vec | std::views::join) { std::cout << elem << " "; } std::cout << "\n"; // 保留行结构的同时,还能给元素做函数式变换(比如乘2) for (const auto& row : two_d_vec) { for (int elem : row | std::views::transform([](int x) { return x * 2; })) { std::cout << elem << " "; } std::cout << "\n"; } return 0; }
为啥你的.iter()会编译报错?
再强调一次:C++标准容器没有iter()这个成员,你需要把.iter()替换成.begin()/.end(),或者直接用range-based for循环就可以解决问题啦。
内容的提问来源于stack exchange,提问作者Yee
相关产品推荐
相关产品推荐

