跟我学C++中级篇——STL容器的查找对比

一、C++标准库的查找

在C++的STL中,对容器或相关序列的查找中,有两种方式,一种是std::find,另外一种是std::search。而且在它们的基础上,还衍生出std::find_if、std::find_if_not、std::find_end等和std::search_n、ranges::search等。

既然都是查找,那么它们二者就会有共通之处更有不同之处,下面就对它们两个进行分析说明。

二、适用场景

std::find和std::search都是用来查找,但适用的场景有所不同。std::find用于在STL容器中查找具体一个值而std::search用来在序列中查找连续的子序列。不过,二者都支持使用谓词进行自定义的扩展,使得查找的应用更加灵活。

三、区别

std::find和std::search的区别主要包括:

1、std::find主要是查询单个值,而std::search搜索一个序列

2、两种查找的参数有所区别,前者查找值,后者查找一个范围

3、std::find的时间复杂度是O(N)而std::search是O(M)~O((N-M+1)*M),其中 N 是主序列的长度,M 是子序列的长度

4、返回值有所不同,前者返回指针目标的迭代器,后者指向子序列起始位置的迭代器

四、例程

根据上面的说明,可结合下面的例程进行分析可以更清楚的明白其应用的情况:

c 复制代码
//find
#include <vector>
#include <algorithm>

std::vector<int> vec = {10, 17, 6, 53, 100};
auto it = std::find(vec.begin(), vec.end(), 53);

// index:3
if (it != vec.end()) {
    std::cout << "value pos: " << std::distance(vec.begin(), it);
}

//search
#include <vector>
#include <algorithm>

std::vector<int> mSeq = {10, 17, 6, 53, 100,6,53};
std::vector<int> sSeq = {6, 53};

auto it = std::search(mSeq.begin(), mSeq.end(), sSeq.begin(), sSeq.end());

// index:2
if (it != mSeq.end()) {
    std::cout << "Subsequence pos: " << std::distance(mSeq.begin(), it);
}

五、总结

内容是比较简单的,写这个目的在于让大家能够有对比的进行学习和分析。这种学习方法在大家上学期间就知道的,应用到C++的编程学习中,也是非常适用的。正所谓,没有对比就没有伤害,没有伤害就没有记忆。虽然编程学习中对比可能没有伤害,但的确可以增强学习的效率。与诸君共勉!

相关推荐
用户69586106727111 分钟前
从源码到加载器:__attribute__((constructor)) / __attribute__((destructor))的跨平台实现原理详解
c++
淡海水20 分钟前
11-02-Unity-Mono-vs-IL2CPP-两种脚本后端的数据结构行为差异
数据结构·unity·游戏引擎·il2cpp·mono
梦帮科技40 分钟前
Next.js 16 模块化单体实战:App Router、领域模块与 Route Handler 分层
css·数据结构·链表·正则表达式·node.js·json·html5
余额瞒着我当琳1 小时前
C++多态深入解析:多态概念,多态实现条件,虚函数表与内存分布,常见问题及注意事项
c++·算法
雨落在了我的手上1 小时前
Java数据结构(十三):排序
数据结构
ocean21031 小时前
2025-2026年C++专题大厂面试高频问题
开发语言·c++·面试
程序猿编码2 小时前
扔掉 Python!纯 C++ 本地跑扩散 TTS,GGML 加持,支持 RK3588 NPU 加速
c++·计算机视觉·大模型·transformer·rk3588·推理·ggml
Logic1012 小时前
C语言/数据结构位运算题解:异或XOR找出独特卡片数字——只出现一次的元素
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
郝学胜-神的一滴2 小时前
C++20模板元编程 02:吃透模板基础核心四大核心知识点
开发语言·数据结构·c++·程序人生·软件工程·visual studio
代码王同学2 小时前
2026.9.15日C++类和对象学习收获笔记
c语言·c++