首页 > 编程知识 正文

vector排序sort,vector排序返回索引

时间:2023-05-04 18:46:25 阅读:185085 作者:3137

最近做的东西,要将vector 中的内容输出,结果发现有些文件被交替反复打开,所以就想吧vector 中的元素排序,学习中发现下面这篇文章总结的挺好的,分享一下也~

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; //类型IDchar 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("%dn",ctn[i].m_uiType);//降序排序sort(ctn.begin(), ctn.end(),greater<AssessTypeInfo>()) ;for ( int i=0; i<3; i++ )printf("%dn",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; //类型IDchar 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("%dn",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++ 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;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。