C++中的结构体vector排序问题

 更新时间:2022年11月11日 11:11:47   作者:gz7seven  
这篇文章主要介绍了C++中的结构体vector排序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

C++结构体vector排序

使用sort函数对一个vector很常用,前提是通文件中必须包含#include ,但是针对结构体vector排序则需要进行一定的改动。

具体事例如下所示

// sort algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector

bool myfunction (int i,int j) { return (i<j); }

struct myclass {
  bool operator() (int i,int j) { return (i<j);}
} myobject;

int main () {
  int myints[] = {32,71,12,45,26,80,53,33};
  std::vector<int> myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33

  // using default comparison (operator <):
  std::sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33

  // using function as comp
  std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)

  // using object as comp
  std::sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)

  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

但是当vector中的变量是结构体,并且需要按照结构体的某一个元素进行排序时,则需要进行一定的修改:

#include "privateHeader.h"
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using std::string;
using std::vector;
using std::cout;
using std::endl;
using namespace std;

typedef struct
{
    float score;
    string file_name;
    string all_file_name;

}TFileProp;

bool GreaterSort(TFileProp a, TFileProp b)
{
    return (a.score > b.score);
}
bool LessSort(TFileProp a, TFileProp b)
{
    return (a.score < b.score);
}
vector<TFileProp> VecFileProp;

VecFileProp.push_back(tFileProp);    //对vector进行push操作

std::sort(VecFileProp.begin(), VecFileProp.end(), GreaterSort);    //进行降序排序
std::sort(VecFileProp.begin(), VecFileProp.end(), LessSort);    //进行升序排序

还有一点,利用Iang传递参一个数据时,由于命令行接收的参数是以char** argv存储的,因此需要先进行强制类型转换,经过一个string作为中间的转换变量,最终转成int型,另外,我之前认为由于是char型的原因,应该主能传递0-255的参数,但是仔细想一下是不对的,因为无论是多大的数,都是以一个字符串传递进去的,然后string类型再进行强转的时候就转陈了int型,因此并不存在256的大小限制。

int main(int argc, char** argv)
{
    // 统计时间
    //timeStatistics();

    // 所有结果放到一个文件夹显示

    int num_save;
    if (argc == 2)
    {
        std::string thres = argv[1];
        num_save = atof(thres.c_str());
        //std::cout << "(int)argv[1] is " << argv[1];
        //std::cout << "num_save is " << num_save;
    }
    else
    {
        num_save = 100;
    }
    showAllResult(num_save);


    return 1;
}

自定义结构体vector排序

写给自己

可以使用结构体内重载小于号,也可以使用编写cmp函数的形式

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef struct stu{
	int niD;
	string strName;
	bool operator < (stu const& a) const  {
		if(niD < a.niD) return true;
        if(niD == a.niD)
			return strName.compare(a.strName) < 0;
        return false;
    }
}stu;
bool cmp(stu a,stu b){
    if(a.niD > b.niD) return true;
    if(a.niD == b.niD)
        return a.strName.compare(b.strName) < 0;
    return false;
}
int main(){
    vector<stu> v;
    stu a;
    stu b;
    a.niD=1;
    a.strName="sfr";
    b.niD=0;
    b.strName="sfr1";
    v.push_back(a);
    v.push_back(b);
    for(stu s:v)
        cout<<s.niD<<endl;
    //结构体内重载小于号
    sort(v.begin(),v.end());
    for(stu s:v)
        cout<<s.niD<<endl;
    //使用cmp函数
    sort(v.begin(),v.end(),cmp);
    for(stu s:v)
        cout<<s.niD<<endl;
    return 0;
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • c++中log4cplus日志库使用的基本步骤和示例代码

    c++中log4cplus日志库使用的基本步骤和示例代码

    这篇文章主要给大家介绍了关于c++中log4cplus日志库使用的相关资料,log4cplus是一款开源的c++日志库,具有线程安全,灵活,以及多粒度控制的特点,log4cplus可以将日志按照优先级进行划分,使其可以面向程序的调试,运行,测试,后期维护等软件全生命周期,需要的朋友可以参考下
    2024-06-06
  • C++ STL 中的数值算法示例讲解

    C++ STL 中的数值算法示例讲解

    本片文章讲解了C++STL 中的数值算法,包含iota、accumulate、adjacent_difference、inner_product、partial_sum这些方法的使用,感兴趣的朋友来看看吧<BR>
    2022-04-04
  • C++类的空指针调用成员函数的代码

    C++类的空指针调用成员函数的代码

    这篇文章主要介绍了C++类的空指针调用成员函数,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • C++获取当前进程IAT的方法

    C++获取当前进程IAT的方法

    这篇文章主要介绍了C++获取当前进程IAT的方法,实例讲述了IAT(导入地址表)的获取方法,在Windows应用程序开发中有着非常实用的应用价值,需要的朋友可以参考下
    2014-10-10
  • C++中二叉堆排序详解

    C++中二叉堆排序详解

    这篇文章主要介绍了C++中二叉堆排序详解,主要介绍了二叉堆排序(递归和非递归实现上沉、下沉算法),需要的朋友可以参考下
    2023-01-01
  • C++实现无重复字符的最长子串

    C++实现无重复字符的最长子串

    本文主要介绍了C++实现无重复字符的最长子串,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • c语言/c++溢出问题浅谈

    c语言/c++溢出问题浅谈

    这篇文章主要给大家介绍了关于c语言/c++溢出问题的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • C/C++ Zlib库封装MyZip压缩类的详细过程

    C/C++ Zlib库封装MyZip压缩类的详细过程

    在软件开发中,文件的压缩和解压缩是一项常见的任务,而ZIP是一种被广泛应用的压缩格式,本文将聚焦于一个简化的C++实现,通过分析代码,我们将深入了解其设计和实现细节,感兴趣的朋友一起看看吧
    2023-11-11
  • QT实现多线程两种方式案例详解

    QT实现多线程两种方式案例详解

    这篇文章主要介绍了QT实现多线程两种方式案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C语言指针详解之野指针

    C语言指针详解之野指针

    这篇文章主要为大家介绍了C语言野指针,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11

最新评论