STL的算法中,一些很简练的算法——持续更新

别在找提高C++晦涩难懂的知识了。提高效率!这里有C++STL——全面总结详细教程(附案例解析)(持续更新中) 不知道什么时候发生的一个现象,大多数人刚开始学语言,听到C和C++给人的感觉就不好! 磊磊写了篇关于C++的见解:让迷茫的彼此,有所寄托~~~ 想专一就选C++!!! https://blog.youkuaiyun.com/cfl997/article/details/103511869 C++提高编程(模板概念内容都在这篇博客中)——(一名负责整合学习的搬运工) 主要包含: 模板(类模板与函数模... 阅读详情

1.在序列1中寻找序列2第一次出现的位置

在序列1中寻找序列2第一次出现的位置在 SGI_STL 中采用了以第一个序列中的每一个元素作为标志的方法向后匹配,直到匹配到第二个序列完整出现。假设第一个序列的长度为n,第二个序列的长度为m,在最坏的情况下,该算法的复杂度为 O((n-m)*m)。该算法的亮点在于写得特别简介明了。具体代码如下:

template<class InputIterator1,class InputIterator2,class Distance1,class Distance2>
	InputIterator1 __search(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Distance1*, Distance2*)
	{
		Distance1 d1 = _LXX::distance(first1, last1);
		Distance2 d2 = _LXX::distance(first2, last2);

		if (d1 < d2)                //若第一个序列小于第二个序列,不可能在第一个序列中找到第二个序列
			return last1;
		
		InputIterator1 curr1 = first1;
		InputIterator2 curr2 = first2;

		while (curr2 != last2)      //当 curr2 == last2,此时完美的找到了匹配的子序列
		{
			if (*curr1 = *curr2)
			{
				++curr1;
				++curr2;
			}
			else
			{
				if (d1 == d2)        //如果这两个序列同等长度,且有一个元素不等,则不用继续判断,肯定找不到
					return last2;
				else
				{
					current1 = ++first1;  //以 first1 作为标志位
					current2 = first2;
					--d1;
				}
			}
		}
		return first1;


2.二分查找

SGI STL中的二分查找写得也很明确间接,是值得学习的代码。其中二分查找范围为[first,last),具体代码如下:

	template<class RandomAccessIterator,class T,class Distance>
	RandomAccessIterator __lower_bound(RandomAccessIterator first, RandomAccessIterator last, const T & value, Distance *, random_access_iterator_tag)
	{
		Distance len = last - first;
		Distance half;
		RandomAccessIterator middle;
		
		while (len > 0)
		{
			half = len >> 1;
			middle = first = half;
			if (*middle < value)
			{
				first = middle + 1;
				len = len - half - 1;
			}
			else
				len = half;
		}
		return first;
	}


3.在序列中寻找满足条件的第一个子序列的位置(n个连续小于/大于/等于某个值的子序列)

SGI STL 中寻找n个连续满足条件的序列的方法是:首先找到第一个满足条件的元素的位置,然后检查连续的 n-1 个元素是否满足要求,若满足,则返回,否则,再次寻找下一个满足该条件的第一个元素,重复上述步骤。具体代码如下:

	template<class InputIterator,class Integer,class T,class BinaryPredicate>
	InputIterator search_n(InputIterator first, InputIterator last, Integer count, const T& value, BinaryPredicate binary_pred)
	{
		if (count <= 0)
			return first;
		else
		{
			while (first != last) //找到第一个满足条件的元素
			{
				if (binary_pred(*first, value)) break;
				++first;
			}
			while (first != last)
			{
				Integer n = count - 1;  //剩余的连续 n - 1 个元素 
				InputIterator i = first;
				++i;
				while (n > 0 && i != last && binary_pred(*i, value)) //检查连续 n - 1 个是否满足条件
				{
					--n;
					++i;
				}
				if (n == 0)           //满足条件则返回
					return first;
				else
				{
					while (i != last)  //否则,继续寻找下一个满足条件的元素
					{
						if (binary_pred(*i, value))  break;
						++i;
					}
					first = i;
				}
			}
			return last;
		}
	}

4.根据条件将序列分为两部分,前一部分满足条件,后一部分不满足条件

SGI STL中的 parittion 使用了前后两个迭代器同时移动进行判断,左边的迭代器找到不符合条件的位置,右边的迭代器找到符合条件的位置,然后双方交换迭代器所指内容,左右迭代器共同往中间移动一格后继续寻找各自的条件,重复直到两个迭代器重合,此时重合处总是指向不符合条件的第一个元素的位置。此时算法并不保证元素之间的稳定性。希望保持相同元素之间的稳定性可以使用 算法导论中的 partition, 即使用两个迭代器同向移动的方法。如果希望保持所有元素之间的稳定性,STL 中有一个 stable_partition 来实现该需求,其中需要新开辟一段临时空间用来存放不满足条件的元素,之后将不满足条件的元素全部 copy 到满足元素之后即可。关于Partition 代码如下:

	template<class BidirectionIterator, class Predicate>
	BidirectionIterator partition(BidirectionIterator first, BidirectionIterator last, Predicate pred)
	{
		while (true)
		{
			while (true)  //从左往右寻找不满足条件的位置
			{
				if (first == last) return first;
				else if (pred(*first)) ++first;
				else break;
			}

			--last; //从上一次\满足条件的位置的前一个位置开始

			while (true) //从右往左寻找满足条件的位置
			{
				if (first == last) return first;
				else if (!pred(*last)) --last;
				else break;
			}
			_LXX::iter_swap(first, last);  //交换找到的两个位置
			++first;  //从上一次满足条件的位置的下一个位置开始
		}
	}
其中,关于保持全部元素的相对稳定性的算法如下,此处我只是摘选出了重点处理部分:

template <class ForwardIterator, class Pointer, class Predicate, 
          class Distance>
ForwardIterator __stable_partition_adaptive(ForwardIterator first,
                                            ForwardIterator last,
                                            Predicate pred, Distance len,
                                            Pointer buffer,
                                            Distance buffer_size) {
  if (len <= buffer_size) {        //当临时容器的大小足够存放所有元素时
    ForwardIterator result1 = first;
    Pointer result2 = buffer;  //临时存储器
    for ( ; first != last ; ++first)
      if (pred(*first)) {
        *result1 = *first;
        ++result1;
      }
      else {
        *result2 = *first;  //将不满足条件的元素放入临时存储
        ++result2;
      }
    copy(buffer, result2, result1); //将临时容器中的元素存入满足条件的元素后
    return result1;
  }
  else {                     //当临时容器的大小不够存储所有元素时
    ForwardIterator middle = first;
    advance(middle, len / 2); //将序列分为两段进行处理
    ForwardIterator first_cut =
      __stable_partition_adaptive(first, middle, pred, len / 2,
                                  buffer, buffer_size);             //处理第一段
    ForwardIterator second_cut =
      __stable_partition_adaptive(middle, last, pred, len - len / 2,
                                  buffer, buffer_size);           //处理后半段

    rotate(first_cut, middle, second_cut);       //将前半段与后半段接起来
    len = 0;
    distance(middle, second_cut, len);
    advance(first_cut, len);
    return first_cut;
  }
}




【STL详解】STL标准模板库入门 | STL版本 | STL六大组件 | STL优点 | 常用STL容器vector、list和map | STL算法函数 | STL使用异常原因分析与总结 本文详细介绍STL标准模板库相关的内容,包括STL版本、STL六大组件、STL优点、常用的STL容器vector、list与map、提升效率的STL算法函数的使用、STL使用异常常见原因分析与总结等,以供大家参考。 阅读详情

相关推荐

C++调用STL算法函数有效提升STL列表的搜索速度(附源码)

本文详细讲述如何使用STL库自带的算法函数去有效提升STL列表的搜索速度

dvlinker的技术专栏 1万+

STL之常用算法(C++)持续更新

STL之常用算法概述0. 头文件1.fill、fill_n、generate、generate_n2. equal、mismatch、lexicographical_compare3. remove、remove_if、remove_copy、remove_copy_if4. replace、replace_if、replace_copy、replace_copy_if5. 数学算法 概述 ST...

ZeroGor的博客 532

C++ STL 标准模板库介绍与入门

C++ STL 标准模板库概述与入门

dvlinker的技术专栏 2万+

STL常用算法总结(持续更新)

STL中的谓词是什么? ​ STL中的谓词是一个可调用的对象,其返回结果是一个能用作条件的值。标准库算法所使用的谓词分为两类:一元谓词(意味着它们有一个参数)和 二元谓词(意味着它们有两个参数)。接受谓词参数的算法对输入序列中的元素调用谓词。因此,元素类型必须能转换为谓词的参数类型。 建议:本文中很多地方用到了Lambda表达式,如果不清楚的读者可以参考:C++可调用对象 文章目录一、排序1....

冷山不生云 897

openlayers6【十九】vue HeatmapLayer热力图层实现热力图效果详解

文章目录1. 写在前面2. Heatmap 类实现热力图2.1 Heatmap 参数2.2 实现热力图3. 完整代码4. 添加删除map图层的方法5. 热力图自身的get,set方法 1. 写在前面 我们主要看热力图的效果,区域绘制效怎么设置详细内容可以访问 openlayers6【十七】vue VectorLayer矢量图层画地图省市区,多省市区(粤港澳大湾区)效果详解 在 openlayers 中,图层是使用 layer 对象表示的,主要有 WebGLPoints Layer、热度图(HeatMap L

@必意玲 1万+

电机FOC控制实战:STM32 CubeMX配置六路互补PWM与死区优化

本文详细介绍了如何使用STM32 CubeMX配置六路互补PWM与死区优化,实现电机FOC控制。通过实战经验分享,包括时钟配置、定时器设置、死区时间计算及优化技巧,帮助开发者避免常见问题,提升电机控制性能。特别适用于STM32G4系列的无刷电机驱动应用。

weixin_29193259的博客 401

C++ STL详解超全总结(快速入门STL)

C++STL合集,包含vector,stack,queue,map,set,array,tuple,deque,priority_queue等诸多内容,全文上万字。

行码棋 30万+

AI视频生成模型训练:从数据准备到部署全流程

咱们这次的目的就像是要建造一座超级厉害的AI视频生成魔法城堡。范围呢,就是从收集建造城堡的材料(数据准备)开始,到把城堡搭建起来(模型训练),再到让城堡能供大家使用(模型部署),涵盖了整个过程的方方面面。接下来我们会先给大家介绍一些重要的术语,就像认识冒险途中的关键道具一样。然后引入一个有趣的故事,带大家进入AI视频生成的奇妙世界,解释核心概念以及它们之间的关系。接着会详细讲解核心算法原理、数学模型和公式,还会有项目实战,带大家亲自体验代码的魅力。

小白菜的博客 399

C++ STL学习【持续更新】

STL常用操作学习,其它用到再补,欢迎补充呀~~C++常用标准模板库1.vector(动态数组)一、vector的初始化二、vector对象的几个重要操作三、遍历vector四,几种重要的算法,需要包含头文件`#include ` 更详细内容参考其它dalao总结 C++常用标准模板库 vector,set,string,map,queue,priority_queue,stack,pair,bi...

py今天刷题了吗 407

“反激电源”是AC/DC隔离电源还是DC/DC隔离电源?

所以在一些场景,我们的输入电压是一个DC,但是我们仍然需要隔离电源的需求,我们就会只采用图9.2的右半部分。在这个场景下“反激电源”是DC/DC。所以此AC/DC的本质是将AC变成高压的DC之后,用带隔离变压器的反激式开关电源产生一个隔离的、稳定的直流电压。一般在讲述各种电源的拓扑的文章和书籍都是在讲述AC/DC的电源拓扑分类的时候,讲述Flyback。反激式开关电源是指使用反激高频变压器隔离输入输出回路的开关电源,反激式隔离变压器开关电源重点表述的是开关电源包含变压器的拓扑结构。

qq_43416206的博客 1290

深度学习实战107-基于Qwen3+GraphRAG+Agent的智能文档管理系统:精准问答与决策支持

在当今信息爆炸的时代,企业面临海量文档的管理与利用挑战。传统文档管理系统虽然提供了存储和检索功能,但缺乏对文档内容的深度理解与分析能力,更难以实现基于知识的决策支持。基于多模态大模型Qwen3、GraphRAG技术与Agent框架构建的智能文档管理系统,能够突破传统限制,实现文档内容的精准解析、知识图谱的自动构建、复杂关系的推理分析以及决策建议的生成,为企业知识管理带来革命性变革。

微学AI的博客 864

C++ 学习笔记合集目录【持续更新中】:类与对象、STL 及算法、数据结构与算法

仅为笔者学习笔记记录,用自己的理解记录学习!【持续更新中】1. C++ 基础篇。2. C++ STL 篇。3. C++ 高阶数据结构与算法篇。

weixin_53202576的博客 828

AB测试面试题

AB实验流程以一个实际的业务场景去描述AB实验流程,限定场景来减少和面试官的信息差,确保沟通高效可以以自己简历上某个相关项目的场景来举例,或者以面试的岗位对应的业务来举例子。不能光自己说,要让面试官参与进来,引导面试官往自己熟悉的内容提问,从被动转为主动。回答要有逻辑性,简洁、准确的表达。还是延用之前提到的项目案例,假设之前抖音拍摄页面中右下角相册功能的icon 由相册图标改为 用户相册的最新一张照片这个案例写在了我的简历中。

qq_45727498的博客 857

算法起飞--持续更新中ing

对之前学习算法笔记进行整理上传,不断更新

梓梓心的博客 715

AI工具 | 每个打工人必备的15款人工智能超级工具

不过,还是有一些靠谱的人工智能平台,它们可不只是营销噱头。有些AI公司正试图改变游戏规则。人工智能工具让人们能够更聪明地工作,而不是更辛苦地劳作。如果你想知道未来有什么,那就来看看这10款人工智能工具吧,它们将彻底改变我们的工作方式。

Vampire_2017的博客 5万+

【华为OD技术面试手撕真题】134、爬楼梯 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)

【华为OD技术面试手撕真题】134、爬楼梯 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何

KJ.JK 2183

【C++STL精讲】初识STL&STL简介

从本章开始,我们就正式进入C++STL的学习了。首先我们来认识一下什么是STL以及它的重要性并了解它的缺陷。当然关于STL中更多细节的知识我们将会在后续的文章中逐渐渗透。

花想云的博客 1097

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

c++领域展开第十二幕——STL(STL简介——简单了解STL)超详细!!!!

STL简单了解

daily_233的博客 2186

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

徐小骐的算法笔记(持续更新中)

2025.12.4,大一的第11周,就在上一周我完成了学校的第四次蓝桥杯预选赛,总排名rk10,赚了三百报名费,回忆起自己从六年级开始学c++,初中还能拿j组省二,到了高中只能勉强省三,一开始想试试强基,但是后来发现自己菜的没边了,这几年也没少报班学noi,花了家里不少钱心里很愧疚,所以还是写一份笔记吧,不仅方便自己复习也证明自己学了点东西。

XuXiaoQi_0928的博客 1110

STL容器用法详解及注解(持续更新)

写在前面 以下摘录自wiki STL又称标准模板库,是一个c++软件库,其中包含4个组件,分别为: 算法 容器 函数 迭代器 STL将“在数据上的操作”与“要执行操作的数据分开”,分别以如下概念指代: 容器:包含、放置数据的地方。 迭代器: 在容器中指出一个位置、或成对使用以划定一个区域,用来限定操作所涉及到的数据范围。 算法:...

agang2007的博客 212

C++STL库常用模板简单使用(持续更新)

C++STL库常用模板简单使用(持续更新)1.C++STL库的简单介绍2. 快速排序 sort2.1 对基本类型数组(int、double、char)进行排序2.2 对基本类型数组从大到小排序2.3 用自定义的排序规则,对任何类型T的数组排序3.二分查找算法3.1 binary_search 1.C++STL库的简单介绍 STL全称:Standard Template Library 标准模板库 (具体的枯燥无味的概念可以自行百度百科) 模板库内容主要包含了一些常用的算法如快速排序、简单查找等,当然还包括

xujiaming0411的博客 564

C++刷题中常用的STL操作汇总(持续更新中ing...)

在用C++刷LeetCode的时候,经常会遇到一些关于STL的操作,但老是会忘记。故借此把常用的STL的操作记录下来,以备查询~

要相信光 3954

STL 中的常见实用库函数(适合初学算法者阅读)(持续更新中)

本篇文章主要讲解一些stl库中的一些常用函数,有些没有写全,欢迎评论区补全哦 首先当然是最好用的万能头文件啦:#include<bits/stdc++.h> 这个头文件中包含了绝大部分我们所需要的头文件,比如stdio.h algorithm math.h 等等 当然在使用它时记得要配合using namespace std; 使用哟,这是因为using namespace std; 这样命名空间std内定义的所有标识符都有效(曝光)。但这又会带来了一个新问题。无数原有的C++代码都..

H-rosy的博客 3437

算法设计工具——STL

C++中已经实现了数据结构中的很多容器和算法,它们构成了C++库的子集,即标准模板类库。STL是一个功能强大的基于模板的容器库。 遵循“尽可能使用STL而不是自己实现”,下面整理STL的一些使用方法便于搜索。(之前已经整理了一些例如map) 持续更新中ing,未完待续(只能抽时间来写) 你的三连就是我创作的最大动力。 目录STL概述STL迭代器顺序容器vectorstring STL概述 STL只要由容器,算法和迭代器。迭代器用于存放元素。下面给出常用的数据结构。算法主要由 数据结构 说明

JacinLee的博客 624

STL的常用核心算法【C++每日一学】

本文深入解析C++ STL中的sort和find等算法,涵盖核心概念、实现原理及实践应用

不会C++、害怕嵌入式且不爱看动漫的小趴菜 1万+

STL容器 关于array用法的记录—持续更新

更新STL容器array的内容,本次更新内容主要是以使用array为主,主要的算法是以容器自身成员函数. #include <iostream> #include <array> #include <algorithm> int main() { //初始化数组 std::array<int,10> data0;//数组的...

m0_38036750的博客 223
上一篇: 系统调用与中断
下一篇: 搜索引擎的基础知识
Virtual_Func
博客等级 码龄11年 38粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值