c语言 vector元素比大小max_C++ min_element、max_element和minmax_element求极值算法详解

algorithm 头文件中定义了 3 个可以运用到序列的算法:

min_element():会返回一个指向输入序列的最小元素的迭代器;

max_element():会返回指向最大元素的迭代器;

minmax_element():会以 pair 对象的形式返回这两个迭代器。

序列必须由正向迭代器指定,仅仅有输入迭代器是不够的。对于这 3 个算法,除了序列的开始和结束迭代器,可以选择提供第三个参数来定义比较函数。下面是将这 3 个算法应用到整数的一些代码:

std::vector data {2, 12, 3, 5, 17, -11, 113, 117, 19}; std::cout << "From values ";

std::copy(std::begin(data), std::end(data),std::ostream_iterator{std::cout, " "});

std::cout << "\n Min = " << *std::min_element(std::begin(data), std::end (data))<< " Max = " << *std::max_element (std::begin (data), std::end(data))<< std::endl;

auto start_iter = std::begin(data) + 2;

auto end_iter = std::end(data) - 2;

auto pr = std::minmax_element(start_iter, end_iter); // Get min and max

std::cout << "From values ";

std::copy(start_iter, end_iter, std::ostream_iterator{std::cout, " "});

std::cout << "\n Min = "<< *pr.first << " Max = " << *pr.second << std::endl;

min_element() 和 max_element() 被用来从 data 中查找最小值和最大值。minmax_element() 会被应用到同一个序列上,但会略过前两个和后两个元素。执行这段代码会输出下面的内容:

From values 2 12 3 5 17 -11 113 117 19

Min = -11 Max = 117

From values 3 5 17 -11 113

Min = -11 Max = 113

algorithm 头文件中也定义了 min()、max()、minmax() 的函数模板,它们分别返回最小值、最大值或者两个对象或一个对象的初始化列表的最小值和最大值。我们已经看到它们可以用来比较两个参数。下面是一个将它们用于初始化列表的示例:

auto words = {string {"one"}, string {"two"}, string {"three"}, string {"four"}, string {"five"}, string {"six"}, string {"seven"}, string {"eight"}};

std::cout << "Min = " << std::min(words)<< std::endl;//Min = eight

auto pr = std::minmax(words, [] (const strings s1, const strings s2){return s1.back() < s2.back();});

std::cout << "Min = " << pr.first << " Max = " << pr.second<< std::endl; // Min = one Max = six

words 是 string 对象的一个初始化列表。元素都是 string 对象很重要。如果使用简单的 char*,那么算法将无法正常工作,因为比较的是地址而不是 string 的内容。min() 算法会用 string 对象默认的 operator

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中没有直接对应C++中的`std::nth_element`函数,但是可以使用类似的思路来实现。 `std::nth_element`函数是用来寻找序列中第k小(或第k大)的元素。其实现原理是基于快速排序的分治思想。具体来说,它会选择一个基准元素,将序列分为两部分,使得前一部分元素均小于等于基准元素,后一部分元素均大于等于基准元素。如果基准元素的下标刚好是k,则可以直接返回该元素;否则,根据基准元素的下标与k的大小关系,递归地在前半部分或后半部分寻找第k小(或第k大)的元素。 下面是一个用C语言实现的类似`std::nth_element`函数的例子: ```c #include <stdio.h> void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = low - 1; for (int j = low; j < high; j++) { if (arr[j] <= pivot) { i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return i + 1; } int nth_element(int arr[], int n, int k) { int low = 0, high = n - 1; while (low <= high) { int pivotIndex = partition(arr, low, high); if (pivotIndex == k - 1) { return arr[k - 1]; } else if (pivotIndex > k - 1) { high = pivotIndex - 1; } else { low = pivotIndex + 1; } } return -1; // 如果k非法,返回-1 } int main() { int arr[] = {1, 4, 2, 5, 3}; int n = sizeof(arr) / sizeof(arr[0]); int k = 3; int result = nth_element(arr, n, k); if (result == -1) { printf("k is invalid!\n"); } else { printf("The %d-th smallest element is %d\n", k, result); } return 0; } ``` 运行结果为: ``` The 3-th smallest element is 3 ``` 可以看到,该实现与C++中的`std::nth_element`函数类似。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值