【问题标题】:Can we count a set of values of vector like a group?我们可以像一组一样计算向量的一组值吗?
【发布时间】:2023-02-26 18:54:30
【问题描述】:

我很抱歉这个标题,但我实际上不确定正确的术语。

例如,我有以下元素。

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

然后我想计算范围内有多少元素1个30.所以答案会是2个自从1020是在1个30范围。

我可以这样做;

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

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

但是有更好的方法吗?

【问题讨论】:

  • 您可以使用更实用的样式,但我认为您的操作方式没有任何问题。普通的 for 循环通常是最清晰的。
  • @Edd虽然有效,但感觉很难看,而且当我想计算其他范围集时代码行太多。例如 1 到 30、31 到 40、41 到 60、61 到 80、81 到 100,等等。这意味着我需要声明更多的反击和条件。
  • 开放式反馈更适合Code Review。我也建议cppreference.com
  • 对于您的标题,也许“计算满足特定条件的向量的值”会更具描述性?
  • @发行版“当我想计算其他范围集时代码行太多”-- 这就是为什么应该为每个任务编写一个函数(又名“更实用的风格”)。如果您的代码在一个将低值和高值作为参数的函数中(而不是直接使用130),那么相同的函数可以用于任何范围。

标签: c++


【解决方案1】:

但是有更好的方法吗?

就简单性而言更好的方法,也许没有。但如果您正在寻找一种计算效率高的解决方案,您可以对已排序的输入使用二进制搜索。

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

【讨论】:

  • O(n lg n) 与 op 的 O(n) 解相比。
  • 但是,如果 OP 希望按照他的评论中的建议进行多个存储桶,那么此解决方案是理想的。
【解决方案2】:

您的代码没有任何问题。如果您正在寻找更少的代码行,并且您使用的是 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;
}

【讨论】:

    【解决方案3】:

    如果您的输入数据未排序,您的解决方案是正确的,但是您可以使用更明确的 std::count_if 重写它:

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

    【讨论】:

      【解决方案4】:

      这是 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

      【讨论】:

        猜你喜欢
        • 2020-01-23
        • 1970-01-01
        • 1970-01-01
        • 2021-06-24
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        相关资源
        最近更新 更多