C++中当 vector 中的数据类型为基本类型时我们调用std::sort函数很容易实现 vector中数据成员的升序和降序排序,然而当vector中的数据类型为自定义结构体类型时,我们该怎样实现升序与降序排列呢?有两种方法,下面的例子能很好的说明:
方法1:
我们直接来看代码吧,比较简单,容易理解:
#include "stdafx.h"
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
struct AssessTypeInfo
{
unsigned int m_uiType; //类型ID
char m_szName[64]; //类型名称
unsigned int m_uiTotal; //总分数
bool operator < (const AssessTypeInfo& rhs ) const //升序排序时必须写的函数
{
return m_uiType < rhs.m_uiType;
}
bool operator > (const AssessTypeInfo& rhs ) const //降序排序时必须写的函数
{
return m_uiType > rhs.m_uiType;
}
}
int main()
{
vector<AssessTypeInfo > ctn ;
AssessTypeInfo a1;
a1.m_uiType=1;
AssessTypeInfo a2;
a2.m_uiType=2;
AssessTypeInfo a3;
a3.m_uiType=3;
ctn.push_back(a1);
ctn.push_back(a2);
ctn.push_back(a3);
//升序排序
sort(ctn.begin(), ctn.end(),less<AssessTypeInfo>()) ; //或者sort(ctn.begin(), ctn.end()) 默认情况为升序
for ( int i=0; i<3; i++ )
printf("%d\n",ctn[i].m_uiType);
//降序排序
sort(ctn.begin(), ctn.end(),greater<AssessTypeInfo>()) ;
for ( int i=0; i<3; i++ )
printf("%d\n",ctn[i].m_uiType);
return 0 ;
}
以上方法就可以实现升序排序,输出结果为 1 2 3
降序排序结果3 2 1。
方法2 : 不修改结构体或类的定义部分,我们用函数对象来实现:
#include "stdafx.h"
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
struct AssessTypeInfo
{
unsigned int m_uiType; //类型ID
char m_szName[64]; //类型名称
unsigned int m_uiTotal; //总分数
};
bool lessmark(const AssessTypeInfo& s1,const AssessTypeInfo& s2)
{
return s1.m_uiType < s2.m_uiType;
}
bool greatermark(const AssessTypeInfo& s1,const AssessTypeInfo& s2)
{
return s1.m_uiType > s2.m_uiType;
}
int main()
{
vector<AssessTypeInfo > ctn ;
AssessTypeInfo a1;
a1.m_uiType=1;
AssessTypeInfo a2;
a2.m_uiType=2;
AssessTypeInfo a3;
a3.m_uiType=3;
ctn.push_back(a1);
ctn.push_back(a2);
ctn.push_back(a3);
sort(ctn.begin(), ctn.end(),lessmark) ; //升序排序
for ( int i=0; i<3; i++ )
printf("%d\n",ctn[i].m_uiType);
sort(ctn.begin(), ctn.end(),greatermark) ; //降序排序
return 0 ;
}
以上方法就可以实现升序排序,输出结果为 1 2 3
降序排序结果3 2 1。
方法2是一种比较简单的方法。
以上两种方法您可根据您自己的需求选择,并且以上两种方法在VC++6.0环境下编译通过,也是自己在实践过程中的总结,如有不妥的地方,欢迎您指出,至于为什么这样使用,请参考 stl算法中sort 部分。
分享到:
相关推荐
"C++自定义结构体排序实现" C++中的结构体排序是指对自定义结构体类型的数据进行排序操作。排序是按照某个键值进行的,例如结构体中的某个成员变量。下面我们将介绍两种实现结构体排序的方法。 一、使用重载运算符...
本文将详细介绍`std::sort`的使用,包括基本的vector排序和自定义比较函数对结构体排序。 首先,`std::sort`函数通常用于排序容器(如vector)中的元素。在C++中,需要包含`<algorithm>`头文件来使用这个函数。以下...
在这个例子中,可能有三个结构体变量,每个结构体包含一组相关的数据。例如,可以定义一个表示学生信息的结构体: ```cpp struct Student { std::string name; int age; float score; }; ``` 接着,我们创建三...
在项目"ConsoleApplication2"中,你可能会看到一个实际应用这个模板类的示例,包括如何定义结构体、如何创建和使用单例模板类,以及如何进行排序操作。这样的实现方式有助于代码的组织和可维护性,尤其是在大型项目...
初始时,已排序部分只包含序列中的第一个元素,而未排序部分则包含剩余的所有元素。排序过程就是从未排序部分依次取出元素,并将其插入到已排序部分的适当位置,使该元素与已排序部分的元素保持有序关系。 #### 三...
在结构体或类的排序场景中,`sort()`默认的比较操作可能无法满足需求,因为结构体或类通常包含多个成员,而不仅仅是简单的数值。在这种情况下,我们需要自定义比较函数。文章中给出的例子是一个名为`PAIR`的结构体,...
接下来,我们可以创建一个`std::vector<MyStruct>`来存储多个这样的结构体实例。 ```cpp std::vector<MyStruct> myVector; ``` 当我们需要查找具有特定ID的结构体并更新其`value`时,有几种方法可以实现: 1. **...
// 创建一个包含i数组中前两个元素的Vector ``` 5. **多维 Vector 的创建**: ```cpp vector<vector<类型>> vi; ``` 示例: ```cpp vector<vector<int>> v5; // 创建一个二维Vector vector<int> line; ...
在电话本的例子中,我们可以创建一个`std::vector`来存储每个联系人的结构体,该结构体包含姓名和电话号码字段。 ```cpp struct Contact { std::string name; std::string phoneNumber; }; ``` 接下来,我们创建...
这篇文档主要介绍了`vector`的基本使用方法,包括定义、赋值、迭代器、增加元素、删除元素、引用元素、查找以及排序。 1. **定义和赋值**: - `vector<int> viCount;` 创建了一个空的整型`vector`。 - `vector...
4. **写入排序后的数据**:遍历排序后的容器,将每个结构体或类实例的字段写入到输出文件,确保每个字段间以逗号分隔,每行结束后换行。 在`Unit_Test_WriteCSV`这个测试文件中,可能包含了对上述功能的单元测试,...
对于结构体排序,需要提供自定义的比较函数,如`cmp`,来指定排序依据。在STL中,`sort`函数可以用于`vector`,但不适用于`queue`和`stack`,因为它们不支持直接排序。`set`本身是有序的,而`map`虽然内部有序,但不...
在上述代码中,`Compare`结构体重载了小于操作符,用于根据pair的第一个元素(数字)和第二个元素(字符串)进行排序。 除了内置的`sort()`函数,C++还提供了其他排序算法,如`stable_sort()`(稳定排序)、`...
在C++中,这些信息可以被封装在一个结构体或类中,然后将这些对象存储在`std::vector`中。这样,通讯录可以轻松地增加新的联系人,或者根据需要查找和删除联系人。 `std::vector`提供了丰富的成员函数,如`push_...
二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键值,且满足以下性质:对于任意节点,其左子树中的所有节点的键值都小于该节点的键值,而右子树中的...
STL的核心组件包括容器、迭代器、算法和函数对象。在这个主题中,我们将深入探讨四个关键的容器:vector、list、map以及pair,它们都是STL中的重要组成部分。 1. **vector**: - `vector`是一种动态数组,允许在...
排序向量类通常是一个类或结构体,它基于数组(向量)并提供了排序功能。在C++中,std::vector是一个常用的数据结构,可以方便地存储和操作动态大小的元素序列。当我们将排序功能与std::vector结合时,就形成了一个...
在C++中,我们可以定义一个类或结构体来实现冒泡排序的功能。这里提到的`miniVector`类看起来像是一个简化的动态数组,它提供了类似标准库`std::vector`的操作,如添加元素、删除元素以及访问元素等。这个类的成员...
一种常见的方式是使用邻接表来表示图,其中每个节点包含一个链表,链表中的元素代表与该节点相连的其他节点。在C语言中,可以定义如下结构体: ```c typedef struct Node { int data; struct Node* next; } Node;...