C++ 学习系列 -- 标准库常用得 algorithm function
一 前言
c++ 标准库中提供了许多操作数据结构:vector、list、deque、map、set 等函数,学习并了解这些常用函数对于我们理解 c++ 的一些设计模式有着重要的作用。
二 常用的 algorithm function 源码
源代码位置:
bits/stl_algo.h
1. accumulate
/*** @brief Accumulate values in a range.** Accumulates the values in the range [first,last) using operator+(). The* initial value is @a init. The values are processed in order.** @param __first Start of range.* @param __last End of range.* @param __init Starting value to add other values to.* @return The final sum.*/
template<typename _InputIterator, typename _Tp>inline _Tpaccumulate(_InputIterator __first, _InputIterator __last, _Tp __init){for (; __first != __last; ++__first)__init = __init + *__first;return __init;}/*** @brief Accumulate values in a range with operation.** Accumulates the values in the range [first,last) using the function* object @p __binary_op. The initial value is @p __init. The values are* processed in order.** @param __first Start of range.* @param __last End of range.* @param __init Starting value to add other values to.* @param __binary_op Function object to accumulate with.* @return The final sum.*/template<typename _InputIterator, typename _Tp, typename _BinaryOperation>inline _Tpaccumulate(_InputIterator __first, _InputIterator __last, _Tp __init,_BinaryOperation __binary_op){for (; __first != __last; ++__first)__init = __binary_op(__init, *__first);return __init;}
accumulate 函数又两个重载版本:
第一个函数的第三个参数是初始值,是单纯的将 数据累加到初始值 init 上;
第二个函数的第三个参数是 “累加” 的初始值,第四个参数是函数或者仿函数对象,是可以自定义 “累加” 的函数 binary_op ,该函数的作用是将迭代器中的每个元素都执行一遍 binar_op 后,将结果 “累加” 到 初始值 init 上
2. for_each
/*** @brief Apply a function to every element of a sequence.* @ingroup non_mutating_algorithms* @param __first An input iterator.* @param __last An input iterator.* @param __f A unary function object.* @return @p __f** Applies the function object @p __f to each element in the range* @p [first,last). @p __f must not modify the order of the sequence.* If @p __f has a return value it is ignored.*/template<typename _InputIterator, typename _Function>_Functionfor_each(_InputIterator __first, _InputIterator __last, _Function __f){for (; __first != __last; ++__first)__f(*__first);return __f; // N.B. [alg.foreach] says std::move(f) but it's redundant.}
for_each 函数第三个函数是函数或者仿函数对象,该函数作用是遍历迭代器,并对迭代器中的每个元素分别执行一次 _Function ,_Function 可以用户自定义
3. replace/replace_if
/*** @brief Replace each occurrence of one value in a sequence with another* value.* @ingroup mutating_algorithms* @param __first A forward iterator.* @param __last A forward iterator.* @param __old_value The value to be replaced.* @param __new_value The replacement value.* @return replace() returns no value.** For each iterator @c i in the range @p [__first,__last) if @c *i ==* @p __old_value then the assignment @c *i = @p __new_value is performed.*/template<typename _ForwardIterator, typename _Tp>voidreplace(_ForwardIterator __first, _ForwardIterator __last,const _Tp& __old_value, const _Tp& __new_value){for (; __first != __last; ++__first)if (*__first == __old_value)*__first = __new_value;}/*** @brief Replace each value in a sequence for which a predicate returns* true with another value.* @ingroup mutating_algorithms* @param __first A forward iterator.* @param __last A forward iterator.* @param __pred A predicate.* @param __new_value The replacement value.* @return replace_if() returns no value.** For each iterator @c i in the range @p [__first,__last) if @p __pred(*i)* is true then the assignment @c *i = @p __new_value is performed.*/template<typename _ForwardIterator, typename _Predicate, typename _Tp>voidreplace_if(_ForwardIterator __first, _ForwardIterator __last,_Predicate __pred, const _Tp& __new_value){for (; __first != __last; ++__first)if (__pred(*__first))*__first = __new_value;}
3.1 replace 函数 第三个参数传入的是待被替换的旧值,第四个参数是 被替换后的新值,该函数执行后,会把迭代器中所有值等于旧值得元素都替换为新值
3.2 replace_if 函数第三个参数是一个函数对象,第四个参数是替换后得新值。该函数得作用是将迭代器中所有符合传入函数规则得旧值替换为新值。
4. count/count_if
template<typename _InputIterator, typename _Predicate>typename iterator_traits<_InputIterator>::difference_type__count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred){typename iterator_traits<_InputIterator>::difference_type __n = 0;for (; __first != __last; ++__first)if (__pred(__first))++__n;return __n;}/*** @brief Count the number of copies of a value in a sequence.* @ingroup non_mutating_algorithms* @param __first An input iterator.* @param __last An input iterator.* @param __value The value to be counted.* @return The number of iterators @c i in the range @p [__first,__last)* for which @c *i == @p __value*/template<typename _InputIterator, typename _Tp>inline typename iterator_traits<_InputIterator>::difference_typecount(_InputIterator __first, _InputIterator __last, const _Tp& __value){return std::__count_if(__first, __last,__gnu_cxx::__ops::__iter_equals_val(__value));}/*** @brief Count the elements of a sequence for which a predicate is true.* @ingroup non_mutating_algorithms* @param __first An input iterator.* @param __last An input iterator.* @param __pred A predicate.* @return The number of iterators @c i in the range @p [__first,__last)* for which @p __pred(*i) is true.*/template<typename _InputIterator, typename _Predicate>inline typename iterator_traits<_InputIterator>::difference_typecount_if(_InputIterator __first, _InputIterator __last, _Predicate __pred){return std::__count_if(__first, __last,__gnu_cxx::__ops::__pred_iter(__pred));}
1. __count_if 函数第三个传入参数是一个函数或者仿函数对象,该函数的作用是遍历迭代器,统计有符合传入函数的元素个数
2. count 函数第三个参数是一个值,该函数作用是遍历迭代器,统计与传入值相等的元素个数
3. count_if 直接调用了 __count_if ,作用与 1 中描述相同
5. find/find_if
/// This is an overload used by find algos for the Input Iterator case.template<typename _InputIterator, typename _Predicate>inline _InputIterator__find_if(_InputIterator __first, _InputIterator __last,_Predicate __pred, input_iterator_tag){while (__first != __last && !__pred(__first))++__first;return __first;}/// This is an overload used by find algos for the RAI case.template<typename _RandomAccessIterator, typename _Predicate>_RandomAccessIterator__find_if(_RandomAccessIterator __first, _RandomAccessIterator __last,_Predicate __pred, random_access_iterator_tag){typename iterator_traits<_RandomAccessIterator>::difference_type__trip_count = (__last - __first) >> 2;for (; __trip_count > 0; --__trip_count){if (__pred(__first))return __first;++__first;if (__pred(__first))return __first;++__first;if (__pred(__first))return __first;++__first;if (__pred(__first))return __first;++__first;}switch (__last - __first){case 3:if (__pred(__first))return __first;++__first;case 2:if (__pred(__first))return __first;++__first;case 1:if (__pred(__first))return __first;++__first;case 0:default:return __last;}}template<typename _Iterator, typename _Predicate>inline _Iterator__find_if(_Iterator __first, _Iterator __last, _Predicate __pred){return __find_if(__first, __last, __pred,std::__iterator_category(__first));}/*** @brief Find the first occurrence of a value in a sequence.* @ingroup non_mutating_algorithms* @param __first An input iterator.* @param __last An input iterator.* @param __val The value to find.* @return The first iterator @c i in the range @p [__first,__last)* such that @c *i == @p __val, or @p __last if no such iterator exists.*/template<typename _InputIterator, typename _Tp>inline _InputIteratorfind(_InputIterator __first, _InputIterator __last,const _Tp& __val){return std::__find_if(__first, __last,__gnu_cxx::__ops::__iter_equals_val(__val));}/*** @brief Find the first element in a sequence for which a* predicate is true.* @ingroup non_mutating_algorithms* @param __first An input iterator.* @param __last An input iterator.* @param __pred A predicate.* @return The first iterator @c i in the range @p [__first,__last)* such that @p __pred(*i) is true, or @p __last if no such iterator exists.*/template<typename _InputIterator, typename _Predicate>inline _InputIteratorfind_if(_InputIterator __first, _InputIterator __last,_Predicate __pred){return std::__find_if(__first, __last,__gnu_cxx::__ops::__pred_iter(__pred));}
1. 第一个 __find_if 函数的第三个参数是函数或者仿函数,第四个参数是 input_iterator_tag (该参数连对应的变量都没有,只有一个类型,其主要作用是为了在重载时与第二个 __find_if 进行区分,毕竟 顺序迭代查找与可以随机访问的查找效率上是不同的),该函数的作用是遍历迭代器,从中找出与传入值相等的元素,若是存在则返回该元素的迭代器,否则返回 _last
2. 第二个 __find_if 函数的第三个参数是 函数或者仿函数,第四个参数是 random_access_iterator_tag (该参数连对应的变量都没有,只有一个类型,其主要作用是为了在重载时与第二个 __find_if 进行区分,毕竟 顺序迭代查找与可以随机访问的查找效率上是不同的),该函数的作用是历迭代器,从中找出与传入值相等的元素,若是存在则返回该元素的迭代器,否则返回 _last,效率上应该比第一个 __find_if 高一些。
3. 第三个 __find_if 函数的第三个参数是 函数或者仿函数,该函数的作用是个中转,其底层调用的是第一个或者第二个函数,只不过多了个询问迭代器类型的操作:std::__iterator_category
4. find 函数第三个参数 const _Tp&是传入一个待查找的值,该函数的作用是若是查找到与该值相等的元素,则返回对应的迭代器,否则返回 __last
5. find_if 函数的第三个参数是 函数或者仿函数,该函数底层调用的是第三个函数 __find_if ,该函数的作用是若是查到元素符合传入的函数规则则返回该元素的迭代器,否则返回 __last
6. sort
待补充
7. binary_search
template<typename _ForwardIterator, typename _Tp, typename _Compare>_ForwardIterator__lower_bound(_ForwardIterator __first, _ForwardIterator __last,const _Tp& __val, _Compare __comp){typedef typename iterator_traits<_ForwardIterator>::difference_type_DistanceType;_DistanceType __len = std::distance(__first, __last);while (__len > 0){_DistanceType __half = __len >> 1;_ForwardIterator __middle = __first;std::advance(__middle, __half);if (__comp(__middle, __val)){__first = __middle;++__first;__len = __len - __half - 1;}else__len = __half;}return __first;}/*** @brief Finds the first position in which @a val could be inserted* without changing the ordering.* @param __first An iterator.* @param __last Another iterator.* @param __val The search term.* @return An iterator pointing to the first element <em>not less* than</em> @a val, or end() if every element is less than * @a val.* @ingroup binary_search_algorithms*/template<typename _ForwardIterator, typename _Tp>inline _ForwardIteratorlower_bound(_ForwardIterator __first, _ForwardIterator __last,const _Tp& __val){return std::__lower_bound(__first, __last, __val,__gnu_cxx::__ops::__iter_less_val());}/*** @brief Determines whether an element exists in a range.* @ingroup binary_search_algorithms* @param __first An iterator.* @param __last Another iterator.* @param __val The search term.* @return True if @p __val (or its equivalent) is in [@p* __first,@p __last ].** Note that this does not actually return an iterator to @p __val. For* that, use std::find or a container's specialized find member functions.*/template<typename _ForwardIterator, typename _Tp>boolbinary_search(_ForwardIterator __first, _ForwardIterator __last,const _Tp& __val){_ForwardIterator __i= std::__lower_bound(__first, __last, __val,__gnu_cxx::__ops::__iter_less_val());return __i != __last && !(__val < *__i);}/*** @brief Determines whether an element exists in a range.* @ingroup binary_search_algorithms* @param __first An iterator.* @param __last Another iterator.* @param __val The search term.* @param __comp A functor to use for comparisons.* @return True if @p __val (or its equivalent) is in @p [__first,__last].** Note that this does not actually return an iterator to @p __val. For* that, use std::find or a container's specialized find member functions.** The comparison function should have the same effects on ordering as* the function used for the initial sort.*/template<typename _ForwardIterator, typename _Tp, typename _Compare>boolbinary_search(_ForwardIterator __first, _ForwardIterator __last,const _Tp& __val, _Compare __comp){_ForwardIterator __i= std::__lower_bound(__first, __last, __val,__gnu_cxx::__ops::__iter_comp_val(__comp));return __i != __last && !bool(__comp(__val, *__i));}
1. 第一个 binary_search 函数的 三个参数 __val 是查找的目标值,该函数的作用是利用二分查找法查找目标值,若是查找到目标值,则返回 true,否则返回 false
2. 第二个 binar_search 函数的第三个参数 __val 是查找的目标值 ,第四个参数 __comp 是函数或者仿函数对象,该函数 是利用二分查找法查找目标值,若是查找到某个值使得 __comp(__val, target) 返回 true,则说明查到了目标值,此时返回 true,否则返回 法拉瑟
三 示例
#include<iostream>
#include<algorithm>using namespace std;struct PredicateReplace: public std::unary_function<int, bool>
{bool operator()(const int x) const{return x % 3 == 0;}
};struct PredictCount: public std::unary_function<int, bool>
{bool operator()(int x){return x % 3 == 1;}
};struct PredictBinarySearch:public std::binary_function<int, int, bool>
{bool operator()(int x, int y){std::cout << "x: " << x << ", y: " << y << std::endl;return x < y;}};int main()
{std::vector<int> vec = {10, 50, 60, 20, 30, 40};int init = 0;// 1. accumulatestd::cout << "------ test accumulate ------" << std::endl;std::cout << std::accumulate(vec.begin(), vec.end(), init) << std::endl; // 210init = 600;std::cout << std::accumulate(vec.begin(), vec.end(), init, std::minus<int>()) << std::endl; // 390std::cout << "------ test accumulate ------" << std::endl;// 2. for_eachstruct printVal{void operator()(int x){std::cout << x << " ";}};std::cout << "------ test for_each ------" << std::endl;std::for_each(vec.begin(), vec.end(),printVal());cout << endl;std::cout << "------ test for_each ------" << std::endl;// 3. replace replace_ifstd::cout << "------ test replace ------" << std::endl;std::replace(vec.begin(), vec.end(), 50, 90);std::for_each(vec.begin(), vec.end(),printVal());cout << endl;std::vector<int> vec_replace1 = vec;std::replace_if(vec_replace1.begin(), vec_replace1.end(), PredicateReplace(), 666);std::for_each(vec_replace1.begin(), vec_replace1.end(),printVal());cout << endl;PredicateReplace pp;std::vector<int> vec_replace2 = vec;std::replace_if(vec_replace2.begin(), vec_replace2.end(), std::not1(pp), 666);std::for_each(vec_replace2.begin(), vec_replace2.end(),printVal());cout << endl;std::cout << "------ test replace ------" << std::endl;// 4. count count_ifstd::cout << "------ test count ------" << std::endl;std::vector<int> vec_cout1 = vec;std::cout << std::count(vec_cout1.begin(), vec_cout1.end(), 60) << std::endl;std::cout << std::count_if(vec_cout1.begin(), vec_cout1.end(), PredictCount()) << std::endl;std::cout << "------ test count ------" << std::endl;// 5. find find_ifstd::cout << "------ test find ------" << std::endl;auto iter = std::find(vec.begin(), vec.end(), 30);if(iter != vec.end())std::cout << *iter << std::endl;iter = std::find_if(vec.begin(), vec.end(), PredictCount());if(iter != vec.end())std::cout << *iter << std::endl;std::cout << "------ test find ------" << std::endl;// 6. sortstd::cout << "------ test sort ------" << std::endl;std::sort(vec.begin(), vec.end(), std::greater<int>());std::for_each(vec.begin(), vec.end(),printVal()); // 60 50 40 30 20 10cout << endl;std::sort(vec.begin(), vec.end(), std::less<int>()); // 10 20 30 40 50 60std::for_each(vec.begin(), vec.end(),printVal());cout << endl;std::cout << "------ test sort ------" << std::endl;// 7. binary_searchstd::cout << "------ test binary_search ------" << std::endl;bool isExists = std::binary_search(vec.begin(), vec.end(), 50);if(isExists){std::cout << "50 is existed. " << std::endl;}else{std::cout << "50 is not existed. " << std::endl;}bool isExists2 = std::binary_search(vec.begin(), vec.end(), 60, PredictBinarySearch());if(isExists2){std::cout << "x == 60 is existed. " << std::endl;}else{std::cout << "x == 60 is not existed. " << std::endl;}std::cout << "------ test binary_search ------" << std::endl;return 0;
}
相关文章:
C++ 学习系列 -- 标准库常用得 algorithm function
一 前言 c 标准库中提供了许多操作数据结构:vector、list、deque、map、set 等函数,学习并了解这些常用函数对于我们理解 c 的一些设计模式有着重要的作用。 二 常用的 algorithm function 源码 源代码位置: bits/stl_algo.h 1. accumu…...
[论文笔记]E5
引言 今天又带来一篇文本匹配/文本嵌入的笔记:Text Embeddings by Weakly-Supervised Contrastive Pre-training。中文题目是 基于弱监督对比预训练计算文本嵌入。 本篇工作提出了E5模型(EmbEddings from bidirEctional Encoder rEpresentations)。该模型以带弱监督信号的对…...
k8s 1.28版本:使用StorageClass动态创建PV,SelfLink 问题修复
k8s中提供了一套自动创建 PV 的机制,就是基于 StorageClass 进行的,通过 StorageClass 可以实现仅仅配置 PVC,然后交由 StorageClass 根据 PVC 的需求动态创建 PV。 问题: 使用 k8s 1.28版本,通过 kubectl get pv…...
漏洞复现-dedecms文件上传(CVE-2019-8933)
dedecms文件上传_CVE-2019-8933 漏洞信息 Desdev DedeCMS 5.7SP2版本中存在安全漏洞CVE-2019-8933文件上传漏洞 描述 Desdev DedeCMS(织梦内容管理系统)是中国卓卓网络(Desdev)公司的一套基于PHP的开源内容管理系统&#x…...
vue分片上传
<template><div><input type"file" id"input" /><button click"uploadFile">上传</button></div> </template><script lang"ts" setup> let chunkSize1024 * 1024,index0; const upl…...
【大数据Hive】hive 表数据优化使用详解
目录 一、前言 二、hive 常用数据存储格式 2.1 文件格式-TextFile 2.1.1 操作演示 2.2 文件格式 - SequenceFile 2.2.1 操作演示 2.3 文件格式 -Parquet 2.3.1 Parquet简介 2.3.2 操作演示 2.4 文件格式-ORC 2.4.1 ORC介绍 2.4.2 操作演示 三、hive 存储数据压缩优…...
京东平台数据分析(京东销量):2023年9月京东吸尘器行业品牌销售排行榜
鲸参谋监测的京东平台9月份吸尘器市场销售数据已出炉! 根据鲸参谋电商数据分析平台的相关数据显示,今年9月,京东吸尘器的销量为19万,环比下滑约12%,同比下滑约25%;销售额为1.2亿,环比下滑约11%&…...
基于springboot实现休闲娱乐代理售票平台系统项目【项目源码+论文说明】计算机毕业设计
基于springboot实现休闲娱乐代理售票平台系统演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把休闲娱乐代理售票管理与现在网络相结合,利用java技术建设休闲娱乐代理售票系统,实现休闲娱乐代理售票的信息化。则对于进一步提高休闲娱乐代理售票管…...
jvm对象内存划分
写此篇博客源于面试问到内存分配的细节,然后不明白问的是什么。回过头发现以前看过这块内容,只是有些印象,但是无法描述清楚。 额外概念了解 jvm内存空间是逻辑上连续的虚拟地址空间(虚拟内存中的概念)映射到物理内存…...
网络原理之TCP/IP
文章目录 应用层传输层UDP协议TCP协议TCP 的工作机制1. 确认应答2. 超时重传3. 连接管理TCP 的建立连接的过程(三次握手),和断开连接的过程(四次挥手)TCP 断开连接, 四次挥手 3. 滑动窗口5. 流量控制6. 拥塞控制7. 延时应答8. 捎带应答9. 面向字节流10. 异常情况 本章节主要讨论…...
Docker:数据卷挂载
Docker:数据卷挂载 1. 数据卷2. 数据卷命令补充 1. 数据卷 数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。 Nginx容器有自己独立的目录(Docker为每个镜像创建一个独立的容器,每个容器都是基于镜像创建的运行实例),…...
你会处理 go 中的 nil 吗
对于下面这段代码,我们知道 i 实际上的值就是 nil,所以 i nil 会生效 func main() {var i *int nilif i nil {fmt.Println("i is nil") // i is nil} }现在换一种写法,我们将 i 的类型改成 interface{},i nil 依然…...
高级深入--day42
注意:模拟登陆时,必须保证settings.py里的 COOKIES_ENABLED (Cookies中间件) 处于开启状态 COOKIES_ENABLED True 或 # COOKIES_ENABLED False 策略一:直接POST数据(比如需要登陆的账户信息) 只要是需要提供post数据的ÿ…...
mysql 计算两个坐标距离
方式一:st_distance_sphere 计算结果单位米 SELECT *, st_distance_sphere(point(lng,lat),point(lng,lat)) as distance FROM table mysql 版本5.7 以上 方式二:st_distance 计算结果单位是度 SELECT *, (st_distance(point(lng,lat),point(lng4,lat…...
String、StringBuffer、StringBuilder和StringJoiner
String、StringBuffer、StringBuilder和StringJoiner都是用于处理字符串的类,但它们在性能和使用方式上有一些区别。 String String是不可变的类,一旦创建就不能被修改。对String进行拼接或修改时,实际上是创建了一个新的String对象。适用于…...
【数据结构】插入排序
⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈数据结构 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 直接插入、希尔排序 1. 什么是排序2…...
Photoshop使用笔记总目录
Photoshop基础学习之工具学习 一、【Photoshop界面认识】 二、【 Photoshop常用快捷键】 三、【色彩模式与颜色填充】 四、【选区】 五、【视图】 六、【常用工具组】 七、【套索工具组】 八、【快速选择工具组】 九、【裁剪工具组】 十、【图框工具组】 十一、【吸取…...
最近面试遇到的高频面试题
大家好,我是 jonssonyan 互联网寒冬?金九银十真的不存在了么?虽说现在行情是差了一些,面试机会少了一些,但是大部分公司还是或多或少的招人,春招秋招都在进行。有人离职就有人入职。所以如果你还没约到面试…...
负载均衡有哪些算法,分别在nginx中如何配置?
负载均衡是用于分发传入的网络流量到多个后端服务器的技术,以确保无单个服务器过载,从而提高应用的可用性和响应时间。以下是一些常用的负载均衡算法,以及如何在Nginx中配置它们: 轮询 (Round Robin): 简介:…...
Starknet开发工具
1. 引言 目前Starknet的开发工具流可为: 1)Starkli:音为Stark-lie,为替换官方starknet-CLI的快速命令行接口。Starkli为单独的接口,可独自应用,而不是其它工具的组件。若只是想与Starknet交互࿰…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
