count_if外部值传递问题:统计另一vector中更大元素数量
问题分析与修复方案
嘿,我瞅了下你的代码,问题主要出在两个地方,还有可以优化的空间,我慢慢给你说:
核心问题点
- Lambda未捕获外部变量:你在
count_if里用的lambda表达式[](int x) { return (x > val); }没有捕获外部的val变量,C++的lambda默认不会自动访问外部作用域的变量,必须显式声明捕获方式,不然编译器会直接报错找不到val。 - 未保存统计结果:你调用了
count_if但完全没处理它的返回值,等于白执行了,统计出来的数量根本没被记录或者输出。
修复后的基础版本
先把这两个问题解决,代码就能正常运行了:
#include <vector> #include <algorithm> #include <iostream> using namespace std; int main() { vector<int> vec1 = {1, 3, 5}; vector<int> vec2 = {2, 4, 6, 1, 3}; sort(begin(vec1), end(vec1)); sort(begin(vec2), end(vec2)); vector<int> result_counts; // 用来存储每个元素的统计结果 for (int i = 0; i < vec1.size(); ++i) { int val = vec1[i]; // 这里用[val]值捕获外部变量,同时保存count_if的返回值 int count = count_if(begin(vec2), end(vec2), [val](int x) { return x > val; }); result_counts.push_back(count); // 可以直接输出查看结果 cout << "vec1中的元素 " << val << ",在vec2中有 " << count << " 个元素比它大\n"; } return 0; }
更高效的优化方案
既然你已经把vec2排序了,完全没必要每次都用count_if遍历整个容器——我们可以用二分查找来大幅提升效率!
upper_bound函数能在排序后的容器里快速找到第一个大于val的元素的位置,用容器末尾迭代器减去这个位置,就是比val大的元素总数,时间复杂度从原来的O(n*m)降到O(n log m),数据量大的时候差别特别明显:
#include <vector> #include <algorithm> #include <iostream> using namespace std; int main() { vector<int> vec1 = {1, 3, 5}; vector<int> vec2 = {2, 4, 6, 1, 3}; sort(begin(vec1), end(vec1)); sort(begin(vec2), end(vec2)); vector<int> result_counts; // 用范围for循环更简洁直观 for (int val : vec1) { auto first_greater = upper_bound(begin(vec2), end(vec2), val); int count = end(vec2) - first_greater; result_counts.push_back(count); cout << "vec1中的元素 " << val << ",在vec2中有 " << count << " 个元素比它大\n"; } return 0; }
内容的提问来源于stack exchange,提问作者Bharat Pawar
相关产品推荐
相关产品推荐

