如何在标准C++中同时遍历多个std::vector?
嘿,作为C新手碰到这种没法用依赖库的情况确实有点挠头,不过咱们用标准C完全能搞定多std::vector同时遍历的需求,而且效率一点不输给Boost!结合你给的代码,我给你整理几个不同版本C++都能用的方案,按需选就行:
1. 最直观的索引遍历(全C++版本兼容,新手友好)
这应该是最容易理解的方法了——既然要同时遍历多个vector,只要它们的元素数量一致(一定要先检查这个!),直接用索引下标访问对应位置的元素就行,完全不需要额外工具:
#include <vector> #include <iostream> #include <string> using namespace std; int main(int, char**) { vector<string> questions = {"Planet", "Rocket", "Galaxy"}; vector<string> answers = {"Planet", "Saturn", "Star"}; vector<int> count = {12, 34, 79}; vector<int> score = {324, 956, 289}; vector<int> result; vector<int> subscore; // 关键前提:先检查要同时遍历的vector大小是否一致,防止越界! if (answers.size() != count.size()) { cerr << "Error: answers and count have mismatched sizes!" << endl; return 1; } for (const string& q : questions) { int match = 0; // 用索引同步遍历answers和count for (size_t i = 0; i < answers.size(); ++i) { const string& a = answers[i]; int c = count[i]; if (q.substr(0,2) == a.substr(0,2)) { cout << q.substr(0,3) << " " << a.substr(0,3) << endl; match = c; } else { cout << "No match!" << '\n'; } } result.push_back(match ? match : 0); subscore.push_back(0); } // 输出结果验证 cout << "\nFinal results: "; for (int num : result) cout << num << " "; cout << endl; return 0; }
这个方案的优点是零学习成本,所有C++版本都支持,而且效率拉满——直接内存访问,没有任何额外开销。
2. C++17+ 用结构化绑定让代码更整洁
如果你项目支持C++17,可以用结构化绑定简化变量声明,让代码看起来更清爽,和Boost的写法更接近:
// 替换内层循环部分 for (size_t i = 0; i < answers.size(); ++i) { // 直接把对应位置的元素绑定到a和c上,不用单独声明变量 auto [a, c] = make_pair(answers[i], count[i]); if (q.substr(0,2) == a.substr(0,2)) { cout << q.substr(0,3) << " " << a.substr(0,3) << endl; match = c; } else { cout << "No match!" << '\n'; } }
要是需要同时遍历更多vector(比如你的score),直接扩展tuple就行:
auto [a, c, s] = make_tuple(answers[i], count[i], score[i]);
3. C++20+ 用std::views::zip完全替代boost::combine
如果能升级到C++20,标准库的Ranges模块提供了std::views::zip,用法和boost::combine几乎一模一样,完美替代,而且是原生标准库,完全没依赖:
#include <ranges> // 必须包含这个头文件 #include <tuple> // 替换内层循环部分 for (const auto& tuple : std::views::zip(answers, count)) { // 用结构化绑定直接取出元素,和Boost的tie用法一样方便 auto [a, c] = tuple; if (q.substr(0,2) == a.substr(0,2)) { cout << q.substr(0,3) << " " << a.substr(0,3) << endl; match = c; } else { cout << "No match!" << '\n'; } }
std::views::zip是延迟求值的,不会拷贝元素,效率和直接索引遍历一样高,而且支持任意数量的vector,直接往括号里加就行,比如std::views::zip(answers, count, score)。
小提醒
不管用哪种方法,一定要先检查所有要同步遍历的vector的大小是否相同——如果大小不一样,要么报错处理,要么只遍历到最小的那个vector的末尾,不然会出现越界访问的bug,这是多vector遍历的核心注意点!
内容的提问来源于stack exchange,提问作者Number42
相关产品推荐
相关产品推荐

