例如,我有以下元素。vector<int> n = {10, 20, 50, 35, 40, 48, 100};然后我想计算在1到30范围内存在多少个元素,所以答案是2,因为10和20在1到30范围内。我可以这样做
vector<int> n = {10, 20, 50, 35, 40, 48, 100};
vector<int> n = {10, 20, 50, 35, 40, 48, 100}; int counter=0; for(int x:n){ if(x>=1 && x<=30) counter++; }
但有更好的办法吗?
zpf6vheq1#
你的代码没有任何问题。如果你想减少代码行,并且你使用的是C++20,你可以这样做:
#include <algorithm> #include <iostream> #include <vector> int main() { std::vector<int> n = {10, 20, 50, 35, 40, 48, 100}; int counter = std::ranges::count_if(n, [](int x){return x >= 1 && x <= 30;}); std::cout << counter << std::endl; }
7d7tgy0s2#
但有更好的办法吗?一个更好的方法在简单性方面,也许没有,因为它已经足够简单了。但如果你正在寻找一个计算效率的解决方案,你可以使用二进制搜索排序输入。
int main() { vector<int> n = {0, 10, 20, 30, 50, 35, 40, 48, 100}; sort(n.begin(), n.end()); auto left = lower_bound(n.begin(), n.end(), 1); auto right = upper_bound(n.begin(), n.end(), 30); auto count = right - left; // your answer return count; }
zengzsys3#
如果输入数据未排序,则解是正确的,但是可以使用更显式的std::count_if重写它:
std::count_if
int result = std::count_if(n.begin(), n.end(), [](int x) { return x>=1 && x<=30; });
ui7jx7zq4#
这是C++ 20的函数样式
#include <iostream> #include <vector> #include <algorithm> auto is_in_range(int min, int max) { return [min, max](int x) { return x >= min && x <= max; }; } auto in_range(std::vector<int> v, int min, int max) { return std::count_if(v.begin(), v.end(), is_in_range(min, max)); } int main() { auto int_vec = std::vector<int>{10, 20, 50, 35, 40, 48, 100}; std::cout << "count:" << in_range(int_vec, 10, 20) << std::endl; std::cout << "count:" << in_range({1, 2, 3, 4}, 2, 4) << std::endl; std::cout << "count:" << in_range({6, 9}, 0, 1) << std::endl; return 0; }
输出
count:2 count:3 count:0
你可以运行它here
pkbketx95#
您可以使用functor构建一个通用解决方案,其中不必对范围进行硬编码。
functor
#include <algorithm> #include <iostream> #include <vector> struct RangeChecker { RangeChecker(int min, int max) : min_{min} , max_{max} {} bool operator()(int value) { return value >= min_ && value <= max_; } private: int min_; int max_; }; int main() { std::vector<int> n = {10, 20, 50, 35, 40, 48, 100}; int count = std::ranges::count_if(n, RangeChecker(1, 30)); std::cout << "count = " << count << std::endl; int count2 = std::ranges::count_if(n, RangeChecker(1, 50)); std::cout << "count2 = " << count2 << std::endl; int count3 = std::ranges::count_if(n, RangeChecker(51, 100)); std::cout << "count3 = " << count3 << std::endl; }
这将生成以下输出:
count = 2 count2 = 6 count3 = 1
5条答案
按热度按时间zpf6vheq1#
你的代码没有任何问题。如果你想减少代码行,并且你使用的是C++20,你可以这样做:
7d7tgy0s2#
但有更好的办法吗?
一个更好的方法在简单性方面,也许没有,因为它已经足够简单了。但如果你正在寻找一个计算效率的解决方案,你可以使用二进制搜索排序输入。
zengzsys3#
如果输入数据未排序,则解是正确的,但是可以使用更显式的
std::count_if
重写它:ui7jx7zq4#
这是C++ 20的函数样式
输出
你可以运行它here
pkbketx95#
您可以使用
functor
构建一个通用解决方案,其中不必对范围进行硬编码。这将生成以下输出: