stl源码剖析 详细学习笔记 算法(1)

Dask并行计算框架:大数据处理的Python利器 并行计算是现代大数据处理的核心技术,通过任务分解和分布式执行突破单机内存限制。Dask作为Python生态中的轻量级并行计算框架,采用延迟执行机制和动态任务调度,实现了类似Spark的分布式计算能力。其创新的有向无环图(DAG)调度系统支持自动优化计算路径,而兼容pandas的API设计大幅降低学习成本。在机器学习、物联网数据分析等场景中,Dask能有效处理TB级数据,配合GPU加速和Kubernetes部署方案,成为数据科学家替代Hadoop的高效工具。特别是其内存管理和分区策略优化,使得在普通服务器集群 阅读详情

//---------------------------15/03/27----------------------------



//算法

{

    /*

        质变算法:会改变操作对象之值

        所有的stl算法都作用在由迭代器[first,last)所标示出来的区间上。质变算法 就是

        运算过程会更改区间内的元素内容

        非质变算法:和质变算法相反

                                                                            */

    /*

        stl算法的一般形式

        1>所有的泛型算法的前两个参数都是一对迭代器,通常称为first和last,用以标示算法的操作区间

        2>stl习惯采用前闭后开区间,写成[first,last),表示区间包含first到last(不包含last)

        之间的所有元素。

     

    */

    

    

    //****************************数值算法*****************************

    //accumulate

    //把区间中的数都 “加到” init的副本中 最后返回init副本值

    template<class InputIterator, class T>

    T accumulate(InputIterator first, InputIterator last, T init)

    {

        for(;first != last; ++first)

            init = init + *first;

        return init;

    }

    

    template<class InputIterator,class T, class BinaryOperation>

    T accumulate(InputIterator first, InputIterator last, T init,

                 BinaryOperation binary_op)

    {

        for(;first != last; ++first)

            init = binary_op(init, *first);

        return init;

    }

    

    //adjacent_difference

    //把区间中的数都  “减去” 前一个数 并把结果输出到一个迭代器中

    template<class InputIterator, class OutputIterator>

    OutputIterator adjacent_difference(InputIterator first, InputIterator last,

                                       OutputIterator result)

    {

        if(first == last) return result;

        *result = *first;

        return __adjacent_difference(first, last, result, value_type(first));

    }

    

    template<class InputIterator, class OutputIterator,class T>

    OutputIterator __adjacent_difference(InputIterator first, InputIterator last,

                                         OutputIterator result, T*)

    {

        T value = *first;

        while(++first != last)

        {

            T tmp = *first;

            *++result = tmp - value;

            value = tmp;

        }

        return ++result;

    }

    

    template<class InputIterator, class OutputIterator, class BinaryOperation>

    OutputIterator adjacent_difference(InputIterator first, InputIterator last,

                                       OutputIterator result,

                                       BinaryOperation binary_op)

    {

        if(first == last) return result;

        *result = *first;

        return __adjacent_difference(first, last, result, value_type(first),

                                     binary_op);

        

    }

    

    template<class InputIterator, class OutputIterator,class T>

    OutputIterator __adjacent_difference(InputIterator first, InputIterator last,

                                         OutputIterator result, T*,

                                         BinaryOperation binary_op)

    {

        T value = *first;

        while(++first != last)

        {

            T tmp = *first;

            *++result = binary_op(tmp,value);

            value = tmp;

        }

        return ++result;

    }

    

    

    //inner_product

    //把两个区间中的数做 “内积” 并都 “加到” init的副本中并最后返回这副本

    template<class InputIterator1, class InputIterator2,class T>

    T inner_product(InputIterator1 first1, InputIterator last1,

                    InputIterator2 first2, T init)

    {

        for(; first1 != last1; ++first1,++first2)

            init = init + (*first1 * *first2);

        return init;

    }

    

    template<class InputIterator1, class InputIterator2,class T,

            class BinaryOperation1, class BinaryOperation2>

    T inner_product(InputIterator1 first1, InputIterator last1,

                    InputIterator2 first2, T init, BinaryOperation1 binary_op1,

                    BinaryOperation2 binary_op2)

    {

        for(; first1 != last1; ++first1,++first2)

            init = binary_op1(init, binary_op2(*first1, *first2));

        return init;

    }

    

    //partial_sum

    //把区间中的数都 累“加” 起来。 每加一次就输出一次到 指定迭代器。

    template<class InputIterator, class OutputIterator>

    OutputIterator partial_sum(InputIterator first, InputIterator last,

                                       OutputIterator result)

    {

        if(first == last) return result;

        *result = *first;

        return __partial_sum(first, last, result, value_type(first));

    }

    

    template<class InputIterator, class OutputIterator,class T>

    OutputIterator __partial_sum(InputIterator first, InputIterator last,

                                         OutputIterator result, T*)

    {

        T value = *first;

        while(++first != last)

        {

            value = value + *first;

            *++result = value;

        }

        return ++result;

    }

    

    

    template<class InputIterator, class OutputIterator, class BinaryOperation>

    OutputIterator partial_sum(InputIterator first, InputIterator last,

                               OutputIterator result, BinaryOperation binary_op)

    {

        if(first == last) return result;

        *result = *first;

        return __partial_sum(first, last, result, value_type(first), binary_op);

    }

    

    template<class InputIterator, class OutputIterator,class T>

    OutputIterator __partial_sum(InputIterator first, InputIterator last,

                                 OutputIterator result, T*,

                                 BinaryOperation binary_op)

    {

        T value = *first;

        while(++first != last)

        {

            value = binary_op(value, *first);

            *++result = value;

        }

        return ++result;

    }

    

    //power

    

    template<class T, class Interger>

    inline T power(T x, Interger n)

    {

        return power(x,n,multiplies<T>());

    }

    

    template<class T, class Interger, class MonoidOperation>

    T power(T x, Interger n, MonoidOperation op)

    {

        if(n == 0)

            return identity_element(op);

        else

        {

            //确定 x的m次 值, 为了不重复计算,看n是否能被 x的m次 整除,通过移位便可确定

            while ((n & 1) == 0)

            {

                n >>= 1;

                x = op(x, x);

            }

            //也是为了不重复计算,把x的n次拆分成2^m+2^(m-1)+2^(m-2)+...+1

            //先算出1次,再算出2次,再算出4次。只要对应位置上有数,加进reslt就行,

            //没有数则不加。

            T result = x;

            n >>= 1;

            while (n != 0)

            {

                x = op(x, x);

                if((n & 1) != 0)

                    result = op(result, x);

                n >>= 1;

            }

            return result;

        }

    }

    

    // itoa

    //在一个区间中依次写入value value+1...

    template<class ForwardIterator, class T>

    void itoa(ForwardIterator first, ForwardIterator last, T value)

    {

        while(first != last)

            *first++ = value++;

    }

    //****************************数值算法*****************************

    

    //****************************基本算法*****************************

    

    //equal

    

    template<class InputIterator1, class InputIterator2>

    inline bool equal(InputIterator1 first1, InputIterator1 last1,

                      InputIterator2 first2)

    {

        for(; first != last1; ++first1,++first2)

            if(*first1 != *first2)

                return false;

        return true;

            

    }

    

    

    template<class InputIterator1, class InputIterator2,

            class BinaryPredicate>

    inline bool equal(InputIterator1 first1, InputIterator1 last1,

                      InputIterator2 first2, BinaryPredicate binary_op)

    {

        for(; first != last1; ++first1,++first2)

            if(!binary_op(*first1,*first2))

                return false;

        return true;

        

    }

    

    //fill

    template<class ForwardIterator, class T>

    void fill(ForwardIterator first, ForwardIterator last, const T& value)

    {

        for(; first != last; ++first)

            *first = value;

    }

    

    //fill_n

    //这里少了比较 first不需要和last比较来确定中止条件 所以只需要一个output迭代器

    template<class OutputIterator, class Size, class T>

    OutputIterator fill_n(OutputIterator first, Size n, const T& value)

    {

        for(; n >0 ; --n, ++first)

            *first = value;

        return first;

    }

    

    //iter_swap

    template<class ForwardIterator1, class ForwardIterator2>

    inline void iter_swap(ForwardIterator1 a, ForwardIterator2 b)

    {

        __iter_swap(a, b, value_type(a));

    }

    

    template<class ForwardIterator1, class ForwardIterator2, class T>

    inline void __iter_swap(ForwardIterator1 a, ForwardIterator2 b, T*)

    {

        T tmp = *a;

        *a = *b;

        *b = tmp;

    }

    

    //lexicographical_compare 按字典比较

    template<class InputIterator1, class InputIterator2>

    bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1,

                                 InputIterator2 first2, InputIterator2 last2)

    {

        for(; first1 != last1 && first2 != last2; ++first1, ++first2)

        {

            if(*first1 < *first2)

                return true;

            if(*first2 < *first1)

                return false

        }

        return first1 == last1 && first2 != last2;

    }

    

    template<class InputIterator1, class InputIterator2, class Compare>

    bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1,

                                 InputIterator2 first2, InputIterator2 last2,

                                 Compare comp)

    {

        for(; first1 != last1 && first2 != last2; ++first1, ++first2)

        {

            if(comp(*first1, *first2))

                return true;

            if(comp(*first2, *first1))

                return false

        }

        return first1 == last1 && first2 != last2;

    }

    

    inline bool

    lexicographical_compare(const unsigned char* first1,

                            const unsigned char* last1,

                            const unsigned char* first2,

                            const unsigned char* last2)

    {

        const size_t len1 = last1 - first1;

        const size_t len2 = last2 - first2;

        const int result = memcmp(first1, first2, min(len1, len2));

        return result != 0 ? result < 0 : len1 < len2;

    }

    

    //max两者比较返回大值

    template<class T>

    inline const T& max(const T& a, const T& b)

    {

        return a < b ? b : a;

    }

    

    template<class T, class Compare>

    inline const T& max(const T& a, const T& b, Compare comp)

    {

        return comp(a, b) ? b : a;

    }

    

    //min两者比较返回小值

    

    template<class T>

    inline const T& min(const T& a, const T& b)

    {

        return b < a ? b : a;

    }

    

    template<class T, class Compare>

    inline const T& min(const T& a, const T& b, Compare comp)

    {

        return comp(b,a) ? b : a;

    }

    

    //mismatch 找到第一个不匹配点

    template<class InputIterator1, class InputIterator2>

    pair<InputIterator1, InputIterator2> mismatch(

                                        InputIterator1 first1,

                                        InputIterator1 last1,

                                        InputIterator2 first2)

    {

        while (first != last1 && *first1 == *first2)

        {

            ++first1;

            ++first2;

        }

        return pair<InputIterator1, InputIterator2>(first1, first2);

    }

    

    template<class InputIterator1, class InputIterator2,

            class BinaryPredicate>

    pair<InputIterator1, InputIterator2> mismatch(

                                    InputIterator1 first1,

                                    InputIterator1 last1,

                                    InputIterator2 first2,

                                    BinaryPredicate binary_pred)

    {

        while (first1 != last1 && binary_pred(*first1, *first2))

        {

            ++first1;

            ++first2;

        }

        return pair<InputIterator1, InputIterator2>(first1, first2);

    }

    

    //swap

    template<class T>

    inline void swap(T& a, T& b)

    {

        T tmp = a;

        a = b;

        b = tmp;

    }

    

    

    //copy这个函数为了强化效率下了血本

    

    //正常版本走这边

    template<class InputIterator, class OutputIterator>

    inline OutputIterator copy(InputIterator first, InputIterator last,

                               OutputIterator result)

    {

        return __copy_dispatch<InputIterator,OutputIterator>()

                                (first, last, result);

    }

    

    //char* wchar_t* 走这边

    inline char* copy(const char* first, const char* last, char* result)

    {

        memmove(result, first, last - first);

        return result + (last - first);

    }

    

    inline wchar_t* copy(const wchar_t* first, const wchar_t* last,

                         const wchar_t* result)

    {

        memmove(result, first, sizeof(wchar_t) * (last - first));

        return result + (last - first);

    }

    

    

    //准备一个仿函数,用来再次特化,用仿函数可以根据传入的InputIterator来特化

    //正常版本走这边

    template<class InputIterator, char OutputIterator>

    struct __copy_dispatch

    {

        OutputIterator operator()(InputIterator first, InputIterator last,

                                  OutputIterator result)

        {

            //传入一个迭代器标签,区分是否是随机迭代器

            return __copy(first, last, result, iterator_category(first));

        }

    };

    

    //指针走这边

    template<class T>

    struct __copy_dispatch<T*, T*>

    {

        T* operator()(T* first, T* last, T* result)

        {

            //判断 是否 没有 assignment_operator重载操作

            typedef typename __type_traits<T>::has_trivial_assignment_operator t;

            return __copy_t(first, last, result, t());

        }

    };

    

    //const指针走这边

    template<class T>

    struct __copy_dispatch<const T*, T*>

    {

      T* operator()(const T* first, const T* last, T* result)

        {

            typedef typename __type_traits<T>:: has_trivial_assignment_operator t;

            return __copy_t(first, last, result, t());

        }

    };

    

    //input是基类,不管forward 还是bidi迭代器都走这边

    template<class InputIterator, class OutputIterator>

    inline OutputIterator __copy(InputIterator first, InputIterator last,

                                 OutputIterator result, input_iterator_tag)

    {

        for(; first != last; ++result, ++first)

            *result = *first;

        return result;

    }

    

    //随机迭代器走这边

    template<class RandomAccessIterator, class OutputIterator>

    inline OutputIterator

    __copy(RandomAccessIterator first, RandomAccessIterator last,

           OutputIterator result, random_access_iterator_tag)

    {

        return __copy_d(first, last, result, distance_type(first));

    }

    

    //直接算出区间大小,根据大小来循环 不需要判断迭代是否相等,可以有效提升速度

    template<class RandomAccessIterator, class OutputIterator, class Distance>

    inline OutputIterator

    __copy_d(RandomAccessIterator first, RandomAccessIterator last,

             OutputIterator result, Distance*)

    {

        for(Distance n = last - first; n > 0; --n, ++result, ++first )

            *result = *first;

        return result;

    }

    

    

    //是 没有assignment_operator重载操作的话 就走这。直接复制内存

    template<class T>

    inline T* __copy_t(const T* first, const T* last, T* result,

                       __true_type)

    {

        memmove(result, first, sizeof(T) * (last - first));

        return result + (last - first);

    }

    

    //不是 没有assignment_operator重载操作(也就是有重载) 走这边,调用随机迭代器的copy方法

    template<class T>

    inline T* __copy_t(const T* first, const T* last, T* result,

                        __false_type)

    {

        return __copy_d(first, last, result, (ptrdiff_t*) 0);

    }


STL源码学习系列六: 算法(Algorithm) 算法(Algorithm) 前言 以有限的步骤,解决逻辑或数学上的问题,这一专门科目称为算法(Algorithm)。广而言之,我们所写的每一个程序都是一个算法,其中的每个函数也都是一个算法。当我们发现一个可以解决问题的算法时,下一个重要的步骤就是决定该算法所耗的资源,包括空间时间。 STL算法部分主要是由三个头文件承担: algorithm、numeric、functional ... 阅读详情

相关推荐

STL源码剖析——STL算法之merge合并算法

本文介绍的STL算法中的merge合并算法,源码中介绍了函数merge、inplace_merge。并对这些函数的源码进行详细的剖析,并适当给出使用例子。

关注校招求职,微信号:job_campus 3157

SGISTL源码阅读二十六 数值算法 (stl_numeric.h)

SGISTL源码阅读二十六 数值算法 (stl_numeric.h) 前言 上一篇博客我们简要介绍了一下STL中的算法,所有的数值算法都是放在&lt;stl_numeric.h中的。 深入源码 accumulate 该算法是做累加操作,将指向范围的元素累加到init上,并且将init作为返回值返回,若init为0,则是计算迭代器指定范围值的累加和。要求迭代器类型至少为InputIterator /...

Lyn&Xx 404

STL源码剖析——list容器的排序算法sort()

由于STL本身的排序算法sort接受的输入迭代器是随机访问迭代器,但是双向list链表容器的访问方式是双向迭代器,因此,不能使用STL本身的排序算法sort,必须自己定义属于自己访问的排序算法。我们从源码的剖析中,可以看到该排序算法思想类似于归并排序。

关注校招求职,微信号:job_campus 9381

STL-算法总结

STL——算法简介算法:有限的步骤,解决逻辑或数学上的问题。唯有用来解决特定问题(如排序、查找、最短路径、三点共线、…),并且获取数学上的效能分析与证明,这样的算法才具有可复用性。STL中算法主要包括:排序、查找、排列组合算法等,以及用于数据移动、复制、删除、比较、组合、运算等等的算法。特定算法对应特定数据结构:二叉查找树和红黑树主要是为了解决查找问题而发展出来的特殊数据结构;散列表拥有快速查找的能

没有最好,只有更好! 3964

STL源码剖析——STL算法之remove删除算法

本文介绍的STL算法中的remove删除算法,源码中介绍了函数remove、remove_copy、remove_if、remove_copy_if、unique、unique_copy。并对这些函数的源码进行详细的剖析,并适当给出使用例子。

关注校招求职,微信号:job_campus 2036

STL源码剖析——STL算法之find查找算法

本文介绍的STL算法中的find、search查找算法。在STL源码中有关算法的函数大部分在本文介绍,包含findand find_if、adjacent_find、search、search_n、lower_bound、 upper_bound、 equal_range、binary_search、find_first_of、find_end相关算法,下面对这些算法的源码进行了详细的剖析,并且适当给出应用例子,增加我们对其理解,方便我们使用这些算法。

关注校招求职,微信号:job_campus 4062

STL 简单 <stl_numeric.h> 算法的实现

1.简介 在STL中,算法可以大致分为两类:质变算法、非质变算法。质变算法会改变操作对象的值,非质变算法不会改变操作对象的值。所有的STL算法都作用在迭代器(iterator)所标识的区间上。          本文介绍的数值算法包括: 1.      accumulate:计算 [ first,last ) 内所有元素的总和; 2.      adjacent_difference:计算

chengonghao的博客 758

STL源码剖析——STL算法stl_algo.h

本文剖析的STL算法的源码,在剖析源码的同时会给出一些例子,这样加深对其理解,方便我们对这些算法的使用。

关注校招求职,微信号:job_campus 4002

《STL源码剖析》学习笔记系列之六——算法(1)

1 、算法的泛化过程 泛化过程:把操作对象的型别加以抽象化,把操作对象的标示法和区间目标的移动行为抽象化,整个算法也就在一个抽象层面上工作了。 int *find(int * arrayHead,int arraySize,int value) {     for(int i=0;i        if(arrayHead[i]==value)            break;

HQ的专栏 792

STL源码剖析总结

记录侯捷《STL源码剖析》感悟学习

qq_42579966的博客 1990

STL源码剖析学习笔记(一)

本文主要是对侯捷《STL源码剖析》学习的知识点总结,以及自己搜集到的资料以及理解,若有任何建议以及意见请联系本人 那么,准备迎接吧

es_tech的博客 3877

侯捷——STL源码剖析 笔记

侯捷——STL源码剖析 笔记 1.总览 1.STL六大部件之间的关系 在下图中,我们使用了如下: 1.一个容器vector 2.使用vector时,使用分配器分配内存 3.使用vi.begin(),vi.end()即迭代器,作为算法的参数 4.使用count_if算法 5.使用仿函数less() 6.使用函数适配器来对我们算法的结果进行进一步筛选(not1, bind2nd) 2.复杂度 3.迭代器区间 迭代器是一个左开右闭的区间,也就是说迭代器的end是最后一个元素的下一个元素。 4.容器的结构和

weixin_45067603的博客 1万+

【STL源码剖析】读书笔记

跳过吧在使用迭代器去“撮合”算法和容器时,需要知道容器对象的类型。由此,首先引入了function template参数推导机制,该方法解决了函数形参的推导,但是无法推导出函数的返回值类型。接着有介绍了class的内嵌类型声明,在类(或结构体)中通过typedef T value_type取得参数类型,然后让返回值类型为typename T::value_type获得T的参数类型,但这种方法只在class对象中有效,在原生指针中无法定义内嵌类型。此时,本章最重要的traits特性萃取机就闪亮登场了。

qq_47461884的博客 1354

【STL源码剖析】从源码看 list:从迭代器到算法

本文深入剖析了STL中list容器的实现细节,适合已掌握C++模板和STL基础的开发者学习。文章从六个方面展开:概述list的优劣势;分析节点结构为双向循环链表;探讨迭代器设计与操作重载;揭示循环双向链表的数据结构;讲解构造与内存管理机制;介绍常用接口实现。重点解析了list通过哨兵节点实现"前闭后开"的特性,以及其特有的内存分配方式。文章通过源码分析,展示了STL中list的高效实现技巧,为开发者深入理解STL容器和数据结构提供了宝贵参考。

2401_87944878的博客 7960

基于Zemax的干涉仪仿真——Fizeau球面干涉仪

最近在用Zemax仿真干涉仪,在这之前查资料都是关于一些平面干涉仪的仿真,很少有关于Fizeau型的,尤其是球面干涉仪的仿真,看到很多关于这方面的问题回复都说利用多重结构仿照Zemax马赫-泽德干涉仪去做,但是也没有具体的过程,因此在这里分享一下我仿真的干涉仪步骤方法,具体是利用多重结构完成的仿真。

weixin_46657737的博客 6409

从GWAS到单细胞:利用seismic包精准定位疾病相关的关键细胞亚群与驱动基因

本文详细介绍了如何利用seismic包将GWAS与单细胞测序数据结合,精准定位疾病相关的核心细胞亚群与驱动基因。通过创新的统计算法和实战案例,帮助研究者从遗传汇总数据中挖掘关键生物学机制,提升疾病研究的精准度和效率。

weixin_29215815的博客 441

侯捷《STL源码剖析》--STL学习笔记

这是我看了《STL源码剖析》之后的一些个人的看法,因为要消化某一个东西,最好的方法就是写下自己的看法和理解。再经过时间的积累,就会慢慢积累到你对真正意义的掌握。这是我的第一个比较正式一点学习笔记,以前也有一些,但都比较零散,其中这段时间对STL比较着迷,也希望得到高手的指点,因为我现在对于ALLOCATOR和adapter还不是很理解,我自己也写过一些仿allocator和adapter,但还不太

spark的专栏 3532

Echats-wordcloud 文字云图的踩坑点【Unknown series wordCloud】

一直都是报 【ECharts Unknown series wordCloud】这玩意可能要刷脸,祝你好运吧~

Sky_Bug的博客 2418

STL源码剖析——STL算法之permutation排列组合

本文讲解的是STL算法中的permutation排列组合算法,根据输入序列,排列出下一个排列组合或前一个排列组合。

关注校招求职,微信号:job_campus 2234

从图片到3D模型:用Tripo+Unity打造AI建模流水线(避坑指南)

本文详细介绍了如何利用Tripo和Unity构建AI驱动的3D建模流水线,从图片到3D模型的高效转换。通过文生模型和图生模型的双模系统,开发者可以大幅提升建模效率,适用于游戏开发和数字内容创作。文章还提供了环境配置、图片预处理、批量生成等实用技巧,帮助开发者避开常见陷阱。

weixin_27024175的博客 615

把收款差异从扯皮变成闭环:SAP S/4HANA Dispute Resolution 模块到底解决什么问题?

本文摘要: SAP S/4HANA的争议解决模块(Dispute Resolution)通过标准化流程管理企业应收争议,解决发票与收款差异问题。核心是创建可追踪的Dispute Case工单,明确处理角色(Processor和Manager),并与财务系统联动实现自动清账。系统支持手工/自动创建争议工单,通过动态默认值减少错误,并最终实现争议金额归零的闭环管理。文中给出制造业客户扣款的完整处理案例,并强调组织落地需统一权限与目录。最后提供ABAP代码示例展示如何通过BAPI创建争议工单。(150字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 165

STL源码剖析:STL算法

诸如拷贝(copy)、互换(swap)、替换(replace)、填写(fill)、删除(remove)、排列组合(permutation)、分割(partition)、随机重排(random shuffling)、排序(sort)等算法,都属此类。查找(find),匹配(search),计数(count),巡访(for_each),比较,寻找极值(max, min)等算法。lg()计算的是二进制对数的值(即log2),并乘以 2,这是控制分割深度的手段,以防止快速排序出现性能退化的情况。

_ 1520

【华为OD机试真题E卷】300、 出租车计费 、靠谱的车 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS)

题目描述 >程序员小明打了一辆出租车去上班,出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大,出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常 >  比如: 1、23再多一块钱就变为25; 2、39再多一块钱变为50; 3、399再多一块钱变为500; >  小明识破了司机的伎俩,准备利用自己的学识打败司机的阴谋,给出计费表的表面读数,返回实际产生的费用

KJ.JK 4万+

C++ STL源码剖析 1-std::array

在C++11标准中,std::array是一个模板类,定义在头文件中。它提供了一个固定大小的数组,其大小在编译时确定,并且不允许动态改变。std::arraypublic:// 类型定义// 成员函数// 迭代器std::array的特点包括类型安全、固定大小、内存连续,以及提供了与类似的接口,如size()at()front()back()等。std::array的元素在内存中是连续存储的,这使得它可以高效地访问元素。

wesigj的博客 1751

C# 固高板卡(总线型) 操作类

主要功能有:初始化,轴使能,正负方向手动移动,回0,点到点移动,等待移动完成,输入IO数据读取,输出IO控制,清除报警等功能。

StevenChen的博客 572

Cadence PSpice 仿真11:电感型低通滤波器最坏情况分析仿真实战图文教程

在进行蒙特卡罗分析时会将元器件的容差考虑进去,然后通过运行多次的随机仿真,得到电路输出的一个范围。但是多数情况下设计师关注的只是电路的最坏情况是否满足设计要求。PSpice的最坏情况分析是取在容差的边界点元件参数进行仿真以计算出电路输出的最坏情况。所以如果如果电路中有10个元件的话,需要先取10个元件的标准值仿真1次,然后再分别在10个元件的容差边界处各仿真1次,然后再对仿真结果进行统计和计算,再最坏情况下再仿真1次。

fydar的博客 1944
上一篇: stl源码剖析 详细学习笔记 算法总览
下一篇: stl源码剖析 详细学习笔记 算法(2)
boydfd
博客等级 码龄16年 101粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值