C++ vector存储结构体 _ 排序与查找完整案例【实战】

浅丽小哥_7885

浅丽小哥_7885

2026-04-11

603人浏览

原创

对结构体vector排序必须显式传比较器,否则编译失败;查找需用find_if而非find;二分查找lower_bound须保持比较器与排序逻辑一致。

c++ vector存储结构体 _ 排序与查找完整案例【实战】

std::sort 对结构体 vector 排序必须传比较器

不重载 operator 的结构体,直接调用 <code>std::sort(v.begin(), v.end()) 会编译失败 —— 编译器不知道怎么比。常见报错是 invalid operands to binary expression 或类似 no match for 'operator。

正确做法是显式传入比较逻辑,推荐用 lambda 表达式,简洁且作用域清晰:

struct Student {
    int id;
    std::string name;
    double gpa;
};
<p>std::vector<student> students = {{102, "Alice", 3.8}, {101, "Bob", 3.5}, {103, "Charlie", 3.9}};</student></p><p>// 按 GPA 降序
std::sort(students.begin(), students.end(), [](const Student& a, const Student& b) {
return a.gpa > b.gpa;
});</p><p>// 多字段:先按 name 升序,name 相同时按 id 升序
std::sort(students.begin(), students.end(), [](const Student& a, const Student& b) {
if (a.name != b.name) return a.name </p>
  • lambda 参数务必加 const Student&,避免结构体拷贝开销
  • 返回 true 表示 a 应排在 b 前面,这是严格弱序的基本要求
  • 别用 std::greater<student>()</student> —— 它只对内置类型或重载了 operator> 的类型有效

find 和 find_if 在结构体 vector 中的用法差异

std::find 只能做值匹配,而结构体没有默认的 operator==,所以直接用会编译不过;std::find_if 才是查结构体的正确选择。

例如查找 ID 为 102 的学生:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
auto it = std::find_if(students.begin(), students.end(),
    [](const Student& s) { return s.id == 102; });
<p>if (it != students.end()) {
std::cout name </p>
  • std::find 适用于 vector<int></int>、vector<:string></:string> 等自带 == 的类型
  • std::find_if 的 lambda 必须返回 bool,且捕获为空(不需要外部变量)
  • 如果 vector 已排序(如按 id),可用 std::lower_bound 加自定义比较器提速到 O(log n),但注意比较器逻辑要和排序时一致

排序后用 lower_bound 查找需保持比较器一致性

对结构体 vector 排序后想二分查找,不能只传 students.begin(), students.end(), target —— std::lower_bound 默认用 ,而你的排序可能基于 <code>id 或 gpa,不一致就会行为异常(比如永远找不到,或定位错位)。

正确写法(假设已按 id 升序排好):

// 先确保已排序:std::sort(..., [](auto& a, auto& b) { return a.id int target_id = 102;
auto lb = std::lower_bound(students.begin(), students.end(), target_id,
[](const Student& s, int id) { return s.id if (lb != students.end() && lb->id == target_id) {
std::cout 
  • 比较器签名必须是 (const Student&, int) 或 (int, const Student&),取决于你把目标值放左边还是右边
  • 标准写法是 lower_bound(first, last, value, comp),其中 comp(a, b) 应返回 a 意义下的真值
  • 若排序依据是 gpa,这里就必须用 s.gpa ,否则结果不可靠

结构体成员访问与迭代器失效风险

结构体存进 vector 后,所有成员都可直接通过 . 访问,比如 v[i].name 或 it->id;但要注意某些操作会让所有迭代器/引用/指针失效:

  • v.push_back(...) 可能触发内存重分配 → 原有迭代器全部失效
  • v.erase(it) 仅使被删位置及之后的迭代器失效(返回新有效迭代器)
  • v.clear() 或 v.resize(0) 会让全部迭代器失效
  • 若结构体含裸指针(如 char*),深拷贝问题必须手动处理;建议优先用 std::string、std::vector 等 RAII 类型

实际编码中,别在循环里边遍历边 push_back 并依赖当前 it,容易踩空指针或越界 —— 这类 bug 往往只在数据量变大时才暴露。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

5999

3

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

2023.09.04

1138

7

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2118

7

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

2025.06.09

4474

18

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

2025.07.04

4631

25

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

2025.06.09

4474

18

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

2025.07.04

4631

25

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

5999

3

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.29

2945

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习