在C++开发中,vector是最常用的顺序容器之一,日常开发中经常需要从vector中查找指定元素,判断元素是否存在或者获取元素的位置。STL标准库提供的find算法可以很好地满足vector的查找需求,它适用于所有支持迭代器的容器,使用方式统一且逻辑清晰。

find算法的基本使用
使用find算法查找vector元素,首先需要引入对应的头文件,同时需要包含vector的头文件。find算法的核心逻辑是从指定的迭代器区间开始遍历,直到找到第一个和目标值相等的元素,返回对应的迭代器,如果遍历结束没有找到,就返回区间的结束迭代器。
头文件引入
使用find算法需要引入<algorithm>头文件,使用vector需要引入<vector>头文件,引入方式如下:
#include <vector> #include <algorithm> #include <iostream>
查找基本类型元素示例
下面以查找vector<int>中的指定整数为例,演示find算法的基本使用流程:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
// 初始化一个存储整数的vector
std::vector<int> num_vec = {1, 3, 5, 7, 9, 11};
// 要查找的目标值
int target = 7;
// 调用find算法,查找区间是num_vec的开始到结束
auto it = std::find(num_vec.begin(), num_vec.end(), target);
// 判断查找结果
if (it != num_vec.end()) {
// 找到元素,输出元素值和对应的索引
std::cout << "找到目标元素:" << *it << ",索引位置为:" << (it - num_vec.begin()) << std::endl;
} else {
std::cout << "未找到目标元素:" << target << std::endl;
}
return 0;
}
上述代码中,std::find的前两个参数是查找的区间范围,第三个参数是要查找的目标值。如果找到元素,返回的迭代器it指向该元素,通过解引用可以获取元素值,用迭代器减去begin()可以得到元素的索引位置。如果没找到,it等于num_vec.end(),此时解引用it是未定义行为,所以必须先判断返回值。
查找自定义类型元素
如果要查找vector中存储的自定义类型元素,需要让自定义类型支持相等比较操作,也就是重载==运算符,否则find算法无法判断两个元素是否相等。
自定义类型重载==运算符示例
下面定义一个简单的Person结构体,存储姓名和年龄,然后演示查找vector<Person>中的元素:
#include <vector>
#include <algorithm>
#include <iostream>
#include <string>
// 定义自定义类型
struct Person {
std::string name;
int age;
// 重载==运算符,判断两个Person对象是否相等
bool operator==(const Person& other) const {
// 这里以姓名和年龄都相等作为两个对象相等的判断条件
return name == other.name && age == other.age;
}
};
int main() {
// 初始化存储Person的vector
std::vector<Person> person_vec = {
{"张三", 20},
{"李四", 25},
{"王五", 30}
};
// 要查找的目标对象
Person target_person = {"李四", 25};
// 调用find算法查找
auto it = std::find(person_vec.begin(), person_vec.end(), target_person);
if (it != person_vec.end()) {
std::cout << "找到目标人员,姓名:" << it->name << ",年龄:" << it->age << std::endl;
} else {
std::cout << "未找到目标人员" << std::endl;
}
return 0;
}
如果不想修改自定义类型的源码,也可以在调用find算法时传入自定义的比较函数,不过这种情况更适合用find_if算法实现,find算法默认使用==运算符进行比较。
find算法的注意事项
- find算法的时间复杂度是O(n),n是查找区间的元素数量,因为它是顺序遍历查找,不适合频繁查找的场景,频繁查找可以考虑先对vector排序然后使用二分查找。
- 查找区间的范围是左闭右开,也就是[first, last),last迭代器指向的元素不会被检查。
- 如果vector中存储的是指针,find算法比较的是指针的值(也就是地址),而不是指针指向的内容,这时候需要自己实现比较逻辑或者使用find_if算法。
find与vector成员函数find的区别
需要注意,vector本身没有名为find的成员函数,只有map、set等关联容器才有成员函数find,vector的查找只能使用STL的全局find算法,不要混淆两者的使用场景。
| 查找方式 | 适用容器 | 时间复杂度 | 特点 |
|---|---|---|---|
| std::find算法 | 所有支持迭代器的容器,包括vector、list、deque等 | O(n) | 通用顺序查找,使用简单,不需要容器有序 |
| std::binary_search算法 | 有序容器的顺序区间 | O(log n) | 只能判断元素是否存在,不能返回位置,需要容器先排序 |
| std::lower_bound算法 | 有序容器的顺序区间 | O(log n) | 返回第一个大于等于目标值的元素迭代器,需要容器先排序 |
根据实际场景选择合适的查找方式,能提升代码的执行效率。如果只是偶尔查找vector中的元素,用std::find就足够;如果需要频繁查找,建议先对vector排序,再使用二分相关的查找算法。
C++_vectorfind算法STL查找vector元素查找修改时间:2026-07-10 14:15:29