您的位置:首页 > 其它

vector中sort排序(解决char类型数据无法排序的问题)

2010-05-25 21:19 726 查看
C++中当 vector 中的数据类型为基本类型时我们调用std::sort函数很容易实现 vector中数据成员的升序和降序排序,然而当vector中的数据类型为自定义结构体类型时,我们该怎样实现升序与降序排列呢?有两种方法,下面的例子能很好的说明:

方法一:在自定义结构体中重载<、>

#include<vector>
#include<algorithm>
#include<iostream>

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( int argc, char* argv[] )
{
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++ )

cout<<ctn[i].m_uiType<<endl;

//降序排序

sort(ctn.begin(), ctn.end(),greater<AssessTypeInfo>()) ;

for( int i = 0; i < 3; i++ )
cout<<ctn[i].m_uiType<<endl;

return 0;
}

方法2 : 不修改结构体或类的定义部分,我们用函数对象来实现:

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>

using namespace std;

typedef struct tStudent
{
char name[ 10 + 1 ];
string region;
long id;
}Student;

bool Comp( const Student &a, const Student &b )
{
if( string(a.name) != string(b.name) )
return string(a.name) < string(b.name);
if( a.region != b.region )
return a.region < b.region;

if( a.id != b.id )
return a.id < b.id;
}

int main( int argc, char* argv[] )
{
vector<Student> vA;
vector<Student> vB;

Student a = { "aaaa", "beijing", 1 };
Student b = { "aaaa", "nanjing", 10 };
Student c = { "bbbb", "shanghai", 1 };
Student d = { "cccc", "xian", 1 };
Student e = { "cccc", "taiyuan", 100 };

vA.push_back( b );
vA.push_back( e );
vA.push_back( a );
vA.push_back( c );
vA.push_back( d );

cout<<"sort begin:"<<endl;
for( int i = 0; i < vA.size(); i++ )
{
cout<<vA[i].name<<" | "<<vA[i].region<<" | "<<vA[i].id<<endl;
}

sort( vA.begin(), vA.end(), Comp );

cout<<endl<<"sort back:"<<endl;
for( int i = 0; i < vA.size(); i++ )
{
cout<<vA[i].name<<" | "<<vA[i].region<<" | "<<vA[i].id<<endl;
}

system( "pause" );
return 0;
}

方法2是一种比较简单的排序方法。

sort采用的是成熟的"快速排序算法"(目前大部分STL版本已经不是采用简单的快速排序,而是结合内插排序算法)。可以保证很好的平均性能、复杂度为n*log(n)。

qsort()的速度远远慢于<algorithm>中的sort()。主要原因就是那第4个参数,因为编译器不可能内联通过函数指针传递的函数,所以在qsort()中每次判断都会真正地调用一次比较函数。而在sort()中传递的是“仿函数”,这是一个行为类似函数的对象(通过重载operator()实现),而当“调用”它时,编译器可以轻易内联其代码,于是可以省略大量的函数调用,节约时间。

注意:不能对char型数据进行排序,如果非要对char型数据进行排序,则需要将char型数据转换为string类型的数据,才能进行排序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐