用c++stl编码,自定义比较函数对象用于排序。 自定义一个函数对象,用于对 std::vector<int<>进行排序,按照奇数优先于偶数,且在奇数和偶数各自内部按照升序排序的方式进行排序。
时间: 2024-10-13 07:05:54 浏览: 33
在C++中,你可以使用STL(Standard Template Library)提供的`std::sort`函数,并配合自定义的比较函数(也称为谓词),来自定义排序规则。对于这种需求,你需要创建一个专门的对象,它是一个满足`std::binary_function`或`std::unary_function`模板类型的类,这取决于你如何进行比较。
首先,我们可以创建一个二元函数对象,用于比较两个整数:
```cpp
struct OddEvenCompare {
bool operator()(int a, int b) const {
// 首先判断奇偶性
if (a % 2 != 0 && b % 2 == 0) return true; // 奇数优先于偶数
else if (a % 2 == 0 && b % 2 != 0) return false;
// 如果都是奇数或偶数,则进一步按升序排序
return a < b;
}
};
```
然后,你可以这样使用这个比较函数对象对`std::vector<int>`进行排序:
```cpp
std::vector<int> vec = {5, 2, 9, 4, 7, 6}; // 示例向量
std::sort(vec.begin(), vec.end(), OddEvenCompare());
```
这样,`vec`将按照奇数优先、偶数内部升序的顺序排列。
相关问题
C++:将std::vector<std::vector<int>>中重复的元素仅保留一个
可以使用STL中的unique函数来去除重复的元素。但是对于vector<vector<int>>这种类型的嵌套容器,我们需要自定义比较函数,来判断两个vector<int>是否相等。示例代码如下:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
bool isEqual(const std::vector<int>& v1, const std::vector<int>& v2) {
if (v1.size() != v2.size()) {
return false;
}
for (size_t i = 0; i < v1.size(); ++i) {
if (v1[i] != v2[i]) {
return false;
}
}
return true;
}
int main() {
std::vector<std::vector<int>> v{
{1, 2, 3},
{4, 5, 6},
{1, 2, 3},
{7, 8, 9},
{1, 2, 3}
};
auto new_end = std::unique(v.begin(), v.end(), isEqual);
v.erase(new_end, v.end());
for (const auto& inner_v : v) {
for (const auto& element : inner_v) {
std::cout << element << " ";
}
std::cout << std::endl;
}
return 0;
}
```
输出结果为:
```
1 2 3
4 5 6
7 8 9
```
其中,isEqual函数用于比较两个vector<int>是否相等。unique函数会将相邻的相同元素去重,返回去重后的新的末尾迭代器。最后,通过调用vector的erase函数,将新的末尾迭代器之后的元素删除,从而达到去重的目的。
C++: 输入无序且无重复元素的容器std::vector<std::vector<int>> vec1 和 无序且无重复元素的容器std::vector<int> vec2, 将既在vec1中又在vec2中元素分别从vec1、vec2中删除,将vec1与vec2中剩余元素都添加到容器std::vector<int> vec中, 并返回vec
C++代码如下:
```cpp
#include <vector>
#include <algorithm>
std::vector<int> removeAndCombine(std::vector<std::vector<int>>& vec1, std::vector<int>& vec2) {
std::vector<int> vec;
std::vector<int> common;
// 将vec2中与vec1中某个vector中的元素相同的元素添加到common中
for (int i = 0; i < vec1.size(); i++) {
for (int j = 0; j < vec1[i].size(); j++) {
if (std::find(vec2.begin(), vec2.end(), vec1[i][j]) != vec2.end()) {
common.push_back(vec1[i][j]);
}
}
}
// 将vec1中与common中相同的元素删除
for (int i = 0; i < vec1.size(); i++) {
vec1[i].erase(std::remove_if(vec1[i].begin(), vec1[i].end(), [&](int n){return std::find(common.begin(), common.end(), n) != common.end();}), vec1[i].end());
}
// 将vec2中与common中相同的元素删除
vec2.erase(std::remove_if(vec2.begin(), vec2.end(), [&](int n){return std::find(common.begin(), common.end(), n) != common.end();}), vec2.end());
// 将vec1中剩余元素添加到vec中
for (int i = 0; i < vec1.size(); i++) {
std::copy(vec1[i].begin(), vec1[i].end(), std::back_inserter(vec));
}
// 将vec2中剩余元素添加到vec中
std::copy(vec2.begin(), vec2.end(), std::back_inserter(vec));
return vec;
}
```
该函数首先找出vec1和vec2中相同的元素,将它们从vec1和vec2中删除。然后将vec1和vec2中剩余的元素添加到一个新的vector<int> vec中,并返回vec。注意,在此过程中,我们使用了std::remove_if和std::find等STL算法来删除和查找元素。
阅读全文
相关推荐
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)