文章目录
- 1. **基本用法:**
- 2. **比较浮点数:**
- 3. **比较字符串:**
- 4. **使用自定义比较函数:**
- 5. **比较容器中的元素:**
- 6. **使用`std::initializer_list`:**
- 7. **变长参数版本(C++11及以上):**
- 8. **C++17起可用的`std::optional`与`std::max`结合:**
- 9. **比较结构体成员:**
- 10. **并行计算环境下的`std::max`(假设使用了并行算法库):**
- 11. **比较自定义类型的引用计数智能指针**:
- 12. **使用`std::max`与`std::accumulate`结合计算数组最大值**:
- 13. **使用`std::max`与`std::transform_reduce`计算两个序列对应元素的最大值**:
- 14. **比较具有权重的元素**:
- 15. **动态分配内存时获取最大尺寸**:
- 16. **在多维数组中查找最大值**:
- 17. **在关联容器(如map)中查找最大键值对**:
- 18. **在非连续存储结构中查找最大值**:
- 19. **使用`std::max`与`std::for_each`结合遍历集合并输出最大值**:
- 20. **在C++20引入的概念式范围(ranges)中查找最大值**:
以下是一系列C++
std::max
函数的使用示例,涵盖不同情境下的应用:
1. 基本用法:
#include <algorithm>int main() {int a = 10, b = 20;int max_value = std::max(a, b);std::cout << "The maximum value is: " << max_value << std::endl; // 输出 "20"return 0;
}
2. 比较浮点数:
#include <algorithm>double a = 3.14, b = 2.71;
double max_double = std::max(a, b);
std::cout << "The maximum double is: " << max_double << std::endl; // 输出 "3.14"
3. 比较字符串:
#include <algorithm>
#include <string>std::string s1 = "apple", s2 = "banana";
std::string longer_str = std::max(s1, s2);
std::cout << "The longer string is: " << longer_str << std::endl; // 输出 "banana"
4. 使用自定义比较函数:
struct Person {std::string name;int age;
};bool compareAge(const Person& p1, const Person& p2) {return p1.age < p2.age;
}Person p1 = {"Alice", 25}, p2 = {"Bob", 30};
Person older_person = std::max(p1, p2, compareAge);
std::cout << "The older person is: " << older_person.name << std::endl; // 输出 "Bob"
5. 比较容器中的元素:
#include <algorithm>
#include <vector>std::vector<int> v = {1, 3, 5, 2, 4};
auto it = std::max_element(v.begin(), v.end());
std::cout << "The maximum element in the vector is: " << *it << std::endl; // 输出 "5"
6. 使用std::initializer_list
:
#include <algorithm>
#include <iostream>int main() {int max_num = std::max({10, 20, 30, 5, 15});std::cout << "The maximum number from initializer list is: " << max_num << std::endl; // 输出 "30"return 0;
}
7. 变长参数版本(C++11及以上):
#include <algorithm>template<typename T>
T maxOfMany(const T& first, const T& second, const T& rest...) {T result = std::max(first, second);va_list args;va_start(args, second);for (T arg = va_arg(args, T); arg != T(); arg = va_arg(args, T)) {result = std::max(result, arg);}va_end(args);return result;
}int main() {int m = maxOfMany(1, 2, 3, 4, 5);std::cout << "The maximum of several numbers is: " << m << std::endl; // 输出 "5"return 0;
}
注意:C++标准库并未提供内置的变长参数版本的std::max
,上例展示了如何自行实现类似功能。
8. C++17起可用的std::optional
与std::max
结合:
#include <optional>
#include <algorithm>std::optional<int> a = 10, b = 20, c = std::nullopt;
std::optional<int> max_opt = std::max({a, b, c});
if (max_opt.has_value()) {std::cout << "The maximum optional value is: " << max_opt.value() << std::endl; // 输出 "20"
} else {std::cout << "No valid optional values provided." << std::endl;
}
9. 比较结构体成员:
#include <algorithm>
#include <tuple>struct Employee {std::string name;double salary;
};auto salary_comparer = [](const Employee& e1, const Employee& e2) {return std::tie(e1.salary) < std::tie(e2.salary);
};Employee e1 = {"Alice", 50000.0}, e2 = {"Bob", 60000.0};
Employee high_salary_employee = std::max(e1, e2, salary_comparer);
std::cout << "Employee with the highest salary is: " << high_salary_employee.name << std::endl; // 输出 "Bob"
10. 并行计算环境下的std::max
(假设使用了并行算法库):
#include <algorithm>
#include <execution>
#include <vector>std::vector<int> nums = {...}; // 填充大量数据// 注意:在实际并行环境中,应考虑同步问题和负载均衡
int parallel_max = std::reduce(std::execution::par_unseq, nums.begin(), nums.end(), std::numeric_limits<int>::min(),[](int a, int b) { return std::max(a, b); });std::cout << "The maximum value computed in parallel is: " << parallel_max << std::endl;
最后一个例子利用了C++17的并行算法库(假设已经存在并行执行策略),但实际上,C++标准库并没有直接提供并行版的std::max
,此处使用了std::reduce
函数并提供了自定义的组合器来模拟寻找最大值的过程。在真实场景中,使用并行算法库时需要谨慎处理数据同步和其他并发问题。
由于前文已列出10个较全面的std::max
使用案例,这里再补充几个较为特殊或进阶的使用方法:
11. 比较自定义类型的引用计数智能指针:
```cpp
#include <memory>
#include <algorithm>struct RefCounted {int value;std::shared_ptr<int> ref_count;bool operator<(const RefCounted& other) const {return *ref_count < *other.ref_count;}
};std::vector<std::shared_ptr<RefCounted>> objects = { /*...*/ };
auto max_ref_count_obj = *std::max_element(objects.begin(), objects.end(),[](const auto& a, const auto& b) {return *a->ref_count < *b->ref_count;});std::cout << "Object with the highest reference count has value: " << max_ref_count_obj->value << std::endl;
```
12. 使用std::max
与std::accumulate
结合计算数组最大值:
```cpp
#include <numeric>
#include <vector>std::vector<int> arr = {1, 2, 3, 4, 5};
int max_val = std::accumulate(arr.begin(), arr.end(), std::numeric_limits<int>::min(),[](int acc, int val) { return std::max(acc, val); });std::cout << "The maximum value in the array is: " << max_val << std::endl;
```
13. 使用std::max
与std::transform_reduce
计算两个序列对应元素的最大值:
```cpp
#include <numeric>
#include <vector>std::vector<int> a = {1, 2, 3};
std::vector<int> b = {4, 5, 6};// 确保两个向量长度一致
assert(a.size() == b.size());int max_pairwise = std::transform_reduce(a.begin(), a.end(), b.begin(), std::numeric_limits<int>::min(),[](int a, int b) { return std::max(a, b); },[](int acc, int val) { return std::max(acc, val); }
);std::cout << "The maximum pairwise value is: " << max_pairwise << std::endl;
```
14. 比较具有权重的元素:
```cpp
struct WeightedValue {int value;int weight;
};bool compareWeighted(const WeightedValue& w1, const WeightedValue& w2) {return w1.weight * w1.value < w2.weight * w2.value;
}std::vector<WeightedValue> weightedValues = { /*...*/ };
auto max_weighted = *std::max_element(weightedValues.begin(), weightedValues.end(), compareWeighted);std::cout << "The most valuable item considering weight is: " << max_weighted.value << std::endl;
```
15. 动态分配内存时获取最大尺寸:
```cpp
#include <vector>
#include <algorithm>std::vector<std::unique_ptr<int[]>> arrays = { /*...*/ };
int max_size = std::max_element(arrays.begin(), arrays.end(),[](const auto& a, const auto& b) {return a->size() < b->size();})->size();std::cout << "The maximum allocated size among the arrays is: " << max_size << std::endl;
```
以上案例展示了在更复杂的数据结构和场景中如何巧妙地运用std::max
函数,同时也体现了C++泛型编程的优势。
16. 在多维数组中查找最大值:
```cpp
#include <algorithm>
#include <array>std::array<std::array<int, 3>, 2> matrix = {{{1, 2, 3}, {4, 5, 6}}};
int max_in_matrix = *std::max_element(matrix.begin(), matrix.end(),[](const auto& row1, const auto& row2) {return *std::max_element(row1.begin(), row1.end()) <*std::max_element(row2.begin(), row2.end());});std::cout << "The maximum value in the matrix is: " << max_in_matrix << std::endl; // 输出 "6"
```
17. 在关联容器(如map)中查找最大键值对:
```cpp
#include <algorithm>
#include <map>std::map<std::string, int> scores = {{"Alice", 90}, {"Bob", 95}, {"Charlie", 92}};
auto max_entry = *std::max_element(scores.begin(), scores.end(),[](const auto& pair1, const auto& pair2) {return pair1.second < pair2.second;});std::cout << "The student with the highest score is: " << max_entry.first << ", with a score of " << max_entry.second << std::endl;
```
18. 在非连续存储结构中查找最大值:
```cpp
#include <algorithm>
#include <deque>std::deque<int> deque_with_gaps = {1, 2, 4, 8, 16, 32, 64};
auto max_deque = *std::max_element(deque_with_gaps.begin(), deque_with_gaps.end());std::cout << "The maximum value in the deque is: " << max_deque << std::endl; // 输出 "64"
```
19. 使用std::max
与std::for_each
结合遍历集合并输出最大值:
```cpp
#include <algorithm>
#include <set>
#include <iostream>std::set<int> unique_numbers = {1, 2, 3, 4, 5};
int current_max = std::numeric_limits<int>::min();
std::for_each(unique_numbers.begin(), unique_numbers.end(),[&](const int& num) {current_max = std::max(current_max, num);});std::cout << "The maximum value in the set is: " << current_max << std::endl; // 输出 "5"
```
20. 在C++20引入的概念式范围(ranges)中查找最大值:
```cpp
#include <ranges>std::vector<int> vec = {1, 2, 3, 4, 5};
int max_range = std::ranges::max(vec);std::cout << "The maximum value in the range-based view is: " << max_range << std::endl; // 输出 "5"
```
这些案例展示了std::max
在不同数据结构和容器中的应用,包括多维数组、关联容器、非连续存储结构以及C++20的新特性——概念式范围。
python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)
50个开发必备的Python经典脚本(11-20)
50个开发必备的Python经典脚本(21-30)
50个开发必备的Python经典脚本(31-40)
50个开发必备的Python经典脚本(41-50)
————————————————
最后我们放松一下眼睛