C++ 函数返回向量中最小的正整数

c++ function return the smallest positive integer in a vector

本文关键字:整数 函数 返回 向量 C++      更新时间:2023-10-16

我正在使用下面的代码,它返回向量中最小的正整数。我在这里得到了代码。我的问题是有理由将大小传递给函数,您不能在函数体中计算它吗?

另外,第二个if()测试有什么用?我不明白这个 if 语句是如何工作的?

#include <vector>
using namespace std;
int rec_min_pos(const vector<int> & nums, int size) {
    if (size < 1) {
        return INT_MAX;
    }
    if(nums[size-1] > 0){
        return min(nums[size-1], rec_min_pos(nums, size-1));
    }
    else{
        return rec_min_pos(nums, size-1);
    }
}

第二个if语句检查元素的正性,因为函数应返回最小整数。

你的函数是递归的,'size'参数实际上是一加上最后一个要测试的元素的索引。这允许简单的递归函数设计,但需要额外的参数。在函数接口中明确这些要点可能更好

inline int recursive_min_positive(const int*arr, size_t i)
{
    return 
        i==0? std::numeric_limits<int>::max() :
        arr[i-1]<=0? recursive_min_positive(arr,i-1) :
        std::min(arr[i-1],recursive_min_positive(arr,i-1) ;
}
int min_positive(std::vector<int> const&arr)
{
    return recursive_min_positive(arr.data(), arr.size());
}

递归函数设计通常很优雅,但效率低下(尽管编译器倾向于展开递归(。在这里,非递归实现实际上更短、更清晰。

int min_positive(std::vector<int> const&arr)
{
    int result = std::numeric_limits<int>::max();
    for(auto val : arr)
        if(0 < val  &&  val < result) result = val;
    return result;
}

除了所有注释: 您可以像这样重载函数:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// Original function with size argument
int rec_min_pos(const vector<int> & nums, int size) {
  if (size < 1) {
    return INT_MAX;
  }
  if (nums[size - 1] > 0) {
    return min(nums[size - 1], rec_min_pos(nums, size - 1));
  }
  else {
    return rec_min_pos(nums, size - 1);
  }
}
// Overloaded rec_min_pos function
int rec_min_pos(const vector<int> & nums) {
    // here we just call the original rec_mon_pos function
    return rec_min_pos(nums, nums.size());
}
int main()
{
  vector<int> v{ 9,2,7,3,7,5,6 };
  cout << rec_min_pos(v);  // call the overloaded function
}

输出:

2

与递归函数无关,但扩展了我的评论:

int min_positive(std::vector<int> & nums)
{
    auto elem = std::min_element(nums.begin(), nums.end(), 
        [](int lhs, int rhs){ return std::tie(std::signbit(lhs), lhs) < std::tie(std::signbit(rhs), rhs); }
    );
    if ((elem == nums.end()) || std::signbit(*elems)) { return MAX_INT; }
    return *elem;
}

在这里,我们定义了一个比较函数,该函数先先为负,然后按值排序。我们使用三个参数std::min_element ,这将在 nums 中找到一个迭代器。

第一个检查处理一个空nums,第二个检查每个值都是负数,这两个值都被原始忽略,返回MAX_INT