最近做的东西,要将vector 中的内容输出,结果发现有些文件被交替反复打开,所以就想吧vector 中的元素排序,学习中发现下面这篇文章总结的挺好的,分享一下也~
C++中当 vector 中的数据类型为基本类型时我们调用std::sort函数很容易实现 vector中数据成员的升序和降序排序,然而当vector中的数据类型为自定义结构体类型时,我们该怎样实现升序与降序排列呢?有两种方法,下面的例子能很好的说明:
我们直接来看代码吧,比较简单,容易理解:
#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
降序排序结果3
方法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
降序排序结果3
方法2是一种比较简单的方法。
以上两种方法您可根据您自己的需求选择,并且以上两种方法在VC++6.0环境下编译通过,也是自己在实践过程中的总结,如有不妥的地方,欢迎您指出,至于为什么这样使用,请参考 stl算法中sort 部分。
==================================================================================================================================
天要做一个对C++ STL的vector容器做一个排序操作,之前一直把vector当做一个容量可自动变化的数组,是的,数组,所以打算按照对数组进行排序的方法:用快速排序或是冒泡排序等算法自己写一个排序的函数。后来觉得STL这么强大,应该有它自己的排序方法(没有好好学习啊),然后就去google了一下,果然有,而且可以自定义排序的函数,太强大了(而且效率应该比我自己写的要好吧)。
// VectorSort.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
//先自定义一个结构体
struct Test {
int member1;
int member2;
};
//自定义排序函数
bool SortByM1( const Test &v1, const Test &v2)//注意:本函数的参数的类型一定要与vector中元素的类型一致
{
return v1.member1 < v2.member1;//升序排列
}
void MyPushback(std::vector<Test> & vecTest, const int &m1, const int &m2)
{
Test test;
test.member1 = m1;
test.member2 = m2;
vecTest.push_back(test);
}
void PrintVector( std::vector<Test> & vec)
{
/*
插一句,
vec.begin()对应的位置是向量的第一个位置,
vec.end()对应的是vector中的最后的一个元素位置的后面的一个位置(我认为,实际上是一个无效位置)
文档上的定义:Returns an iterator referring to the past-the-end element in the vector container.
*/
for(std::vector<Test>::iterator it = vec.begin() ; it != vec.end() ; it++ )
{
std::cout<<it->member1<<'\t'<<it->member2<<std::endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<Test> vecTest;
MyPushback(vecTest,9,1);
MyPushback(vecTest,8,2);
MyPushback(vecTest,7,3);
MyPushback(vecTest,6,4);
MyPushback(vecTest,5,5);
MyPushback(vecTest,4,6);
MyPushback(vecTest,3,7);
MyPushback(vecTest,2,8);
MyPushback(vecTest,1,9);
//排序之前
std::cout<<"Before Sort:"<<std::endl;
PrintVector(vecTest);
std::cout<<"对向量中的所有元素按member1进行升序排列:"<<std::endl;
std::sort(vecTest.begin(),vecTest.end(),SortByM1);
PrintVector(vecTest);
//std::cout<<"对向量中的第2个到第5个元素按member1进行升序排列:"<<std::endl;
//std::sort(vecTest.begin()+1,vecTest.begin()+5,SortByM1);//vecTest.begin()+5为第6个位置
//PrintVector(vecTest);
return 0;
}