vector struct a按照结构体中某一元素排序相同元素只保留最大值操作

首先根据需求定义了一个结构体

struct face_idx_score
{
    int idx = 0;
    float score = 0.0f;
};

然后使用容器vector定义了一个对象    vector<face_idx_score>     result_face_vec;

需求是相同的idx只保留score最大的一个,并写入.csv文件

使用sort()排序result_face_vec;需要重载操作符 ‘==’    ‘<’

struct face_idx_score
{
    int idx = 0;
    float score = 0.0f;

    bool operator == (const face_idx_score & obj) const //重载 == 操作符
    {
        return idx == obj.idx;
    }

    bool operator < (const face_idx_score & obj) const //重载 < 操作符
    {
//        return idx == obj.idx && score < obj.score;       //此时按照score升序排列
        return idx == obj.idx && obj.score < score;        //此时按照score降序排列
    }
};

 

函数实现

void write_result2csv( vector<face_idx_score> &fscore_vec, vector<string> &fname_vec )
{
    CSVWriter   csv;
    stringstream    stime;
    get_localtime(stime);
    string      csv_name = stime.str() + ".csv";

    csv.enableAutoNewRow(3);
    csv << "名字" << "ID号" <<"相似分值";

    vector<face_idx_score>::iterator    it;
    // detlete error result
    for( it = fscore_vec.begin(); it!= fscore_vec.end(); ){
        if( (*it).score < 0.5 )
            it=fscore_vec.erase(it);
        else
            it++;
    }

    sort(fscore_vec.begin(), fscore_vec.end()); //使用sort()进行排序,排序后的相同元素集中出现
    fscore_vec.erase(unique(fscore_vec.begin(), fscore_vec.end()), fscore_vec.end());
              //unique()函数将重复的元素放到vector的尾部 然后返回指向第一个重复元素的迭代器 再用erase函数擦除从这个元素到最后元素的所有的元素
    for( unsigned int i = 0; i < fscore_vec.size(); i++ ){
        string name = fname_vec.at(fscore_vec.at(i).idx).substr(0, fname_vec.at(fscore_vec.at(i).idx).length() - 4);
        csv << name << fscore_vec.at(i).idx << fscore_vec.at(i).score;
    }

    csv.writeToFile( csv_name, true );
    csv.ss.str( "" );
}

 

当然也可以使用函数的方式规定sort函数时升序还是降序

参考

sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级。本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能讲讲其用法:

1、sort入门:

使用sort需要包含algorithm头文件,完整代码如下
#include<iostream>
#include<vector>
#include<algorithm>//貌似可以不用,但最好加上。
using namespace std;
int main()
{
    vector<int>v;
    v.push_back(13);
    v.push_back(23);
    v.push_back(03);
    v.push_back(233);
    v.push_back(113);
    sort(v.begin(),v.end());
    int i=0;
    for(i=0;i<5;i++)
    {
        cout<<v[i]<<endl;
    }
    system("pause");
    return 0;
}
运行结果如下:

3
13
23
113
233
请按任意键继续. . .

可以看到结果是从小到大排序,但如果我需要从大到小排序呢?

2、改写comp从大到小排序。

加入comp函数后代码如下:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool comp(const int &a,const int &b)
{
    return a>b;
}
int main()
{
    vector<int>v;
    v.push_back(13);
    v.push_back(23);
    v.push_back(03);
    v.push_back(233);
    v.push_back(113);
    sort(v.begin(),v.end(),comp);
    int i=0;
    for(i=0;i<5;i++)
    {
        cout<<v[i]<<endl;
    }
    system("pause");
    return 0;
}
运行结果:

233
113
23
13
3
请按任意键继续. . .

为什么会这样呢?比较时sort函数根据comp函数进行判断输的大小,系统默认a<b时返回真,于是从小到大排,而我的comp函数设定为a>b时返回为真,那么最终得到的排序结果也相应的从小到大变成从大到小。简单吧~~

3、对结构体排序

有了comp函数我们就可以实现对任意结构体任意对象进行排序,只需要对应修改comp函数即可实现。代码如下:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct ss
{
    int a,b;
};
bool comp(const ss &a,const ss &b)
{
    return a.a<b.a;
}
int main()
{
    vector<ss>v;
    ss s1,s2,s3,s4,s5;
    s1.a=4;s1.b=23;
    s2.a=1;s2.b=213;
    s3.a=2;s3.b=231;
    s4.a=5;s4.b=123;
    s5.a=3;s5.b=223;
    v.push_back(s1);
    v.push_back(s2);
    v.push_back(s3);
    v.push_back(s4);
    v.push_back(s5);
    sort(v.begin(),v.end(),comp);
    int i=0;
    for(i=0;i<5;i++)
    {
        cout<<v[i].a<<" "<<v[i].b<<endl;
    }
    system("pause");
    return 0;
}
比如ss结构体中a代表的是索引号,b代表的是索引对应的值,那么我想按索引排序,通过改写comp函数即可实现。

结果:

1 213
2 231
3 223
4 23
5 123
请按任意键继续. . .

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
`mm_struct` 是 Linux 内核的一个重要结构体,代表了进程的内存管理信息。它包含了进程的虚拟内存空间的信息,如进程的内存映射,页表等。 以下是 `mm_struct` 结构体的定义(摘自 Linux 内核源代码 v5.14.5): ```c struct mm_struct { struct vm_area_struct *mmap; /* 进程的内存映射 */ struct rb_root mm_rb; /* 红黑树,用于快速查找虚拟地址所在的 VMA */ struct vm_area_struct *mmap_cache; /* 最近访问的 VMA 缓存 */ unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); unsigned long mmap_base; /* 进程的默认映射地址 */ unsigned long mmap_legacy_base; /* 用于兼容 32 位系统的默认映射地址 */ unsigned long task_size; /* 进程的虚拟地址空间的最大值 */ unsigned long highest_vm_end; /* 进程的虚拟地址空间最高地址 */ pgd_t *pgd; /* 进程页全局目录 */ atomic_t mm_users; /* 引用计数,记录共享该内存管理信息的进程数 */ atomic_t mm_count; /* 记录该内存管理信息的结构体被共享的次数 */ int map_count; /* 进程的内存映射数量 */ spinlock_t page_table_lock; /* 用于保护页表的自旋锁 */ struct rw_semaphore mmap_sem; /* 用于保护进程的内存映射操作 */ struct list_head mmlist; /* 进程链表 */ unsigned long hiwater_rss; /* 进程历史上 RSS 的最高值 */ unsigned long hiwater_vm; /* 进程历史上 total_vm 的最高值 */ unsigned long total_vm; /* 进程的虚拟地址空间总大小 */ unsigned long locked_vm; /* 进程锁定的虚拟地址空间大小 */ unsigned long pinned_vm; /* 进程固定的虚拟地址空间大小 */ unsigned long data_vm; /* 进程数据段的虚拟地址空间大小 */ unsigned long stack_vm; /* 进程栈的虚拟地址空间大小 */ unsigned long def_flags; /* 进程默认的内存映射标志 */ unsigned long nr_ptes; /* 进程页表项数量 */ unsigned long start_code, end_code, start_data, end_data; unsigned long start_brk, brk, start_stack; unsigned long arg_start, arg_end, env_start, env_end; unsigned long saved_auxv[AT_VECTOR_SIZE]; /* 进程的 auxv 信息 */ struct vm_unmapped_area_info *unmap_area; /* 用于管理进程的匿名映射 */ unsigned long *pmd_huge_pte; /* 用于管理大页 */ struct rw_semaphore page_table_lock; struct file *exe_file; /* 进程的可执行文件 */ unsigned long flags; /* 进程的内存管理相关标志 */ struct mm_rss_stat rss_stat; /* 进程的 RSS 统计信息 */ struct linux_binfmt *binfmt; /* 进程的二进制格式 */ cpumask_var_t cpu_vm_mask_var; /* 表示哪些 CPU 上有进程的页表 */ /* ... */ }; ``` `mm_struct` 结构体比较庞大,其包含了很多与进程内存管理相关的信息,如内存映射、页表、锁、统计信息等。通过这些信息,内核可以对进程的内存进行管理和保护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dwyane05

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值