c++ 计算向量中位于给定范围内的元素数

pu3pd22g  于 2023-03-05  发布在  其他
关注(0)|答案(5)|浏览(127)

例如,我有以下元素。
vector<int> n = {10, 20, 50, 35, 40, 48, 100};
然后我想计算在130范围内存在多少个元素,所以答案是2,因为1020130范围内。
我可以这样做

vector<int> n = {10, 20, 50, 35, 40, 48, 100};

int counter=0;
for(int x:n){
   if(x>=1 && x<=30) 
     counter++;
}

但有更好的办法吗?

zpf6vheq

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;
}
7d7tgy0s

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;
}
zengzsys

zengzsys3#

如果输入数据未排序,则解是正确的,但是可以使用更显式的std::count_if重写它:

int result = std::count_if(n.begin(), n.end(), [](int x) { return x>=1 && x<=30; });
ui7jx7zq

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

pkbketx9

pkbketx95#

您可以使用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

相关问题