SGISTL源码探究-stl_algo.h中的基础算法

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

前言

在上一小节中我们分析了stl_algobase.h中的算法,虽然都是一些比较基础的算法,但是了解其中的泛化以及特化的思想是很重要的。

在本小节中我们将分析stl_algo.h中的算法,里面的大部分算法也很基础,比较复杂的我们放在另外的小节分析。

各算法的实现

for_each

遍历[first, last),每个元素使用仿函数f进行处理。

注意传入的迭代器类型是InputIterator,所以可能不支持赋值。

template <class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f) {
  for ( ; first != last; ++first)
    f(*first);
  return f;
}
find

该函数作用是寻找[first, last)范围内值为value的元素,并返回指向其的迭代器。如果没找到,返回last。

注意要求迭代器的类型至少是可读的。

template <class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value) {
  while (first != last && *first != value) ++first;
  return first;
}
find_if

该函数的作用是根据pred仿函数来查找[first, last)范围内第一个令pred返回true的元素,如果没有,返回last。同样也要求迭代器类型至少是可读。

template <class InputIterator, class Predicate>
InputIterator find_if(InputIterator first, InputIterator last,
                      Predicate pred) {
  while (first != last && !pred(*first)) ++first;
  return first;
}
adjacent_find

该函数的作用是找出第一组符合条件的相邻元素。第一个版本是找到相邻的重复元素,而第二个版本是通过传入的binary_pred作为条件。

这里要求迭代器的类型是ForwardIterator。若找到符合条件的,则返回指向该元素的迭代器,否则返回last。

template <class ForwardIterator>
ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last) {
  if (first == last) return last;
  ForwardIterator next = first;
  while(++next != last) {
    if (*first == *next) return first;
    first = next;
  }
  return last;
}

template <class ForwardIterator, class BinaryPredicate>
ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last,
                              BinaryPredicate binary_pred) {
  if (first == last) return last;
  ForwardIterator next = first;
  while(++next != last) {
    if (binary_pred(*first, *next)) return first;
    first = next;
  }
  return last;
}
count

该函数的作用是计算[first, last)范围内,值为value的元素的个数。要求迭代器至少可读。

以下有两个版本,一个是传入n的引用来计数,另一个是自己声明计数器然后返回。

//传入n的引用进行计数
template <class InputIterator, class T, class Size>
void count(InputIterator first, InputIterator last, const T& value,
           Size& n) {
  for ( ; first != last; ++first)
    if (*first == value)
      ++n;
}

/* 通过traits技法获取difference_type来定义计数器
 * 注意这里使用了typename关键字
 * 它的作用是告诉编译器,typename后面的是iterator_traits<InputIterator>::difference_type是一个嵌套的类型,而不是变量成员
 * 如果类型是依赖模板参数的,在使用前需要加上typename表明是类型
 * 但是如果是继承里的基类列表或者在类的初始化成员列表中就不用使用
 * typename大概的作用就这样,它和class并不是完全一样的,这点需要注意
 * 感兴趣可以去看看《effectiveC++》或者查阅相关资料
 * 后面我也会总结出来
 */
template <class InputIterator, class T>
typename iterator_traits<InputIterator>::difference_type
count(InputIterator first, InputIterator last, const T& value) {
  typename iterator_traits<InputIterator>::difference_type n = 0;
  for ( ; first != last; ++first)
    if (*first == value)
      ++n;
  return n;
}
count_if

该函数的作用是计算[first, last)范围内,满足pred仿函数条件的元素的个数。

template <class InputIterator, class Predicate, class Size>
void count_if(InputIterator first, InputIterator last, Predicate pred,
              Size& n) {
  for ( ; first != last; ++first)
    if (pred(*first))
      ++n;
}

该函数中的作用是在序列一[first1, last1)的区间中,寻找序列二[first2, last2)的首次出现点。如果没有,则返回迭代器last1;如果找到了,返回与第二个序列匹配的指向第一个元素的迭代器。
还有另外一个版本的,提供了自己的比较仿函数binary_pred而不是直接比较两元素是否相等。

template <class ForwardIterator1, class ForwardIterator2, class Distance1,
          class Distance2>
ForwardIterator1 __search(ForwardIterator1 first1, ForwardIterator1 last1,
                          ForwardIterator2 first2, ForwardIterator2 last2,
                          Distance1*, Distance2*) {
  //计算[first1, last1)的距离d1
  Distance1 d1 = 0;
  distance(first1, last1, d1);
  //计算[first2, last2)的距离d2
  Distance2 d2 = 0;
  distance(first2, last2, d2);

  /* 如果第一个序列比第二个序列还短
   * 那肯定没有满足的条件的子序列,直接返回last1
   */
  if (d1 < d2) return last1;

  //current1指向第一个序列的第一个元素
  ForwardIterator1 current1 = first1;
  //current2指向第二个序列的第一个元素
  ForwardIterator2 current2 = first2;

  //遍历序列二
  while (current2 != last2)
    //尝试找到相等的元素,找到了则往后移动
    if (*current1 == *current2) {
      ++current1;
      ++current2;
    }
    //若当前元素不相等
    else {
      //若d1=d2,但是此时已经有元素不相等了
      //则不可能满足条件了,直接返回
      if (d1 == d2)
        return last1;
      else {
        //此时将current1后移,再尝试与current2比较
        current1 = ++first1;
        current2 = first2;
        //更新d1
        --d1;
      }
    }
  return first1;
}

//search函数,运用distance_type获取到相关类型
template <class ForwardIterator1, class ForwardIterator2>
inline ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
                               ForwardIterator2 first2, ForwardIterator2 last2)
{
  return __search(first1, last1, first2, last2, distance_type(first1),
                  distance_type(first2));
}
search_n

该函数的作用是在[first, last)区间中,查找连续count个符合条件的元素形成的子序列,如若有,则返回指向该子序列的起始处的迭代器;如果没有,则返回last。

要求迭代器的类型是ForwardIterator及其派生类。还有一个版本是提供了binary_pred仿函数进行比较,这里就不列出源码了,避免太多冗长了。

template <class ForwardIterator, class Integer, class T>
ForwardIterator search_n(ForwardIterator first, ForwardIterator last,
                         Integer count, const T& value) {
  //count小于等于0,直接返回first
  if (count <= 0)
    return first;
  else {
    //调用find函数,先找到第一个值为value的元素,并返回指向其的迭代器
    //如果没有值为value的元素,返回last
    first = find(first, last, value);
    //遍历更新后的[first, last)中的元素
    //first是指向序列中与value相等的第一个元素或者是last
    while (first != last) {
      //n表示剩下需要相等的元素个数
      Integer n = count - 1;
      ForwardIterator i = first;
      ++i;
      //i指向需要比较的元素
      //开始循环比较(因为要求连续的)
      while (i != last && n != 0 && *i == value) {
        ++i;
        --n;
      }
      //n为0代表已经找到满足条件的序列了,返回
      if (n == 0)
        return first;
      else
      //否则找到下一个值为value1的元素为first,重新开始比较
        first = find(i, last, value);
    }
    //遍历完序列还未找到满足条件的序列
    //返回last
    return last;
  }
}
swap_ranges

该函数的作用是将[first1, last1)和[first2, first2 + (last1 - first1))这两个序列的元素互换。

当第二个序列的长度小于第一个序列或者这两个序列在同一个容器互相重叠时,会导致不可预期的结果。

template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1,
                             ForwardIterator2 first2) {
  for ( ; first1 != last1; ++first1, ++first2)
    //调用iter_swap函数
    iter_swap(first1, first2);
  return first2;
}
transform

该函数的作用是遍历[first, last)范围内的元素,并对每一个元素使用仿函数op,并将所有结果作为一个新的序列。还有一个版本是使用binary_op对[first1, last1)以及[first2, first2 + (last1 - first1))这两个序列的每对元素进行求值,将所有结果形成一个新的序列返回。

template <class InputIterator, class OutputIterator, class UnaryOperation>
OutputIterator transform(InputIterator first, InputIterator last,
                         OutputIterator result, UnaryOperation op) {
  for ( ; first != last; ++first, ++result)
    *result = op(*first);
  return result;
}

template <class InputIterator1, class InputIterator2, class OutputIterator,
          class BinaryOperation>
OutputIterator transform(InputIterator1 first1, InputIterator1 last1,
                         InputIterator2 first2, OutputIterator result,
                         BinaryOperation binary_op) {
  for ( ; first1 != last1; ++first1, ++first2, ++result)
    //作用于一对元素上
    *result = binary_op(*first1, *first2);
  return result;
}
replace

该函数的作用是将[first, last)序列中所有值为old_value的元素的值换成new_value。要求迭代器是可读写的类型。

template <class ForwardIterator, class T>
void replace(ForwardIterator first, ForwardIterator last, const T& old_value,
             const T& new_value) {
  for ( ; first != last; ++first)
    if (*first == old_value) *first = new_value;
}
replace_if

该函数的作用是将[first, last)序列中所有满足让pred仿函数返回true的元素的值换成new_value。要求迭代器是可读写的类型。

template <class ForwardIterator, class Predicate, class T>
void replace_if(ForwardIterator first, ForwardIterator last, Predicate pred,
                const T& new_value) {
  for ( ; first != last; ++first)
    if (pred(*first)) *first = new_value;
}
replace_copy

该函数的作用同样也是将[first, last)序列中所有值为old_value的元素的值换成new_value,其他的值保留。不过结果都存在新的序列上。最后会返回新的序列的最后一个元素的下一个位置。

template <class InputIterator, class OutputIterator, class T>
OutputIterator replace_copy(InputIterator first, InputIterator last,
                            OutputIterator result, const T& old_value,
                            const T& new_value) {
  for ( ; first != last; ++first, ++result)
    *result = *first == old_value ? new_value : *first;
  return result;
}
replace_copy_if

这个版本是提供仿函数pred作为比较的函数,而不是判断与old_value是否相等。

template <class Iterator, class OutputIterator, class Predicate, class T>
OutputIterator replace_copy_if(Iterator first, Iterator last,
                               OutputIterator result, Predicate pred,
                               const T& new_value) {
  for ( ; first != last; ++first, ++result)
    *result = pred(*first) ? new_value : *first;
  return result;
}
generate

该函数的作用是将[first, last)序列中的元素的值都赋成仿函数gen的运算结果

template <class ForwardIterator, class Generator>
void generate(ForwardIterator first, ForwardIterator last, Generator gen) {
  for ( ; first != last; ++first)
    *first = gen();
}
generate_n

该函数的作用是将[first, last)序列中的前n个元素的值都赋成仿函数gen的运算结果

template <class OutputIterator, class Size, class Generator>
OutputIterator generate_n(OutputIterator first, Size n, Generator gen) {
  for ( ; n > 0; --n, ++first)
    *first = gen();
  return first;
}
remove_copy

该函数的作用是移除[first, last)区间中所有与value相等的元素,不过这些操作的结果都反应到新序列中,原序列不变。最后返回新序列的最后一个元素的下一个位置。

template <class InputIterator, class OutputIterator, class T>
OutputIterator remove_copy(InputIterator first, InputIterator last,
                           OutputIterator result, const T& value) {
  for ( ; first != last; ++first)
    if (*first != value) {
      *result = *first;
      ++result;
    }
  return result;
}
remove_copy_if

它传入了仿函数pred作为比较的操作,而不是直接判断是否与value相等。

remove_copy和remove_copy_if都没有作用在原序列上,而对应的remove以及remove_if则作用在原序列上,这里就不列出代码了。

template <class InputIterator, class OutputIterator, class Predicate>
OutputIterator remove_copy_if(InputIterator first, InputIterator last,
                              OutputIterator result, Predicate pred) {
  for ( ; first != last; ++first)
    if (!pred(*first)) {
      *result = *first;
      ++result;
    }
  return result;
}
reverse

该函数的作用是反转[first, last)序列,是在原序列上进行操作,同样的还有另外一个版本reverse_copy,将结果存在新序列上,没有太大必要再列出。

/* 可以看到__reverse有两个版本,一个是针对BidirectionalIterator型的
 * 另一个针对RandomAccessIterator型
 * 这样做无非是为了效率
 */
template <class BidirectionalIterator>
void __reverse(BidirectionalIterator first, BidirectionalIterator last,
               bidirectional_iterator_tag) {
  //刚开始看的时候发现只是iter_swap(first++, last)的操作根本没法反转啊
  while (true)
    //原来这里的last是往前移了的,开始没有注意到
    if (first == last || first == --last)
      return;
    else
      iter_swap(first++, last);
}

//当迭代器类型是RandomAccessIterator时,支持first < last这样的操作
//于是我们可以从两端往中间扫,然后交换元素
template <class RandomAccessIterator>
void __reverse(RandomAccessIterator first, RandomAccessIterator last,
               random_access_iterator_tag) {
  while (first < last) iter_swap(first++, --last);
}

//通过iterator_category获取到迭代器的相应型别
template <class BidirectionalIterator>
inline void reverse(BidirectionalIterator first, BidirectionalIterator last) {
  __reverse(first, last, iterator_category(first));
}
unique_copy

该函数的作用是将[first, last)中的元素复制到新序列上(如果有重复的元素,只会赋值其中的第一个元素)。最后返回指向新序列最后一个元素的下一个位置的迭代器。

//要注意传入的result是ForwardIterator型的,代表可以读/写及单步移动。
template <class InputIterator, class ForwardIterator>
ForwardIterator __unique_copy(InputIterator first, InputIterator last,
                              ForwardIterator result, forward_iterator_tag) {
  //首先将新序列result的值赋为第一个元素的值
  *result = *first;
  //遍历原序列
  while (++first != last)
    //若值不重复,则result指向下一个位置,然后将first指向的值赋给它
    if (*result != *first) *++result = *first;
  return ++result;
}

//这个版本的result的类型是OutputIterator型的(只写)
//所以不能像上个版本那样取值判断(*result != *first)
template <class InputIterator, class OutputIterator, class T>
OutputIterator __unique_copy(InputIterator first, InputIterator last,
                             OutputIterator result, T*) {
  //将需要比较的元素用value存起来
  T value = *first;
  *result = value;
  while (++first != last)
    //比较value,若不等于,则更新value
    if (value != *first) {
      value = *first;
      *++result = value;
    }
  return ++result;
}
//调用以上两个版本的其中之一
template <class InputIterator, class OutputIterator>
inline OutputIterator __unique_copy(InputIterator first, InputIterator last,
                                    OutputIterator result,
                                    output_iterator_tag) {
  return __unique_copy(first, last, result, value_type(first));
}

//调用__unique_copy函数
template <class InputIterator, class OutputIterator>
inline OutputIterator unique_copy(InputIterator first, InputIterator last,
                                  OutputIterator result) {
  //首先处理特殊情况
  if (first == last) return result;
  return __unique_copy(first, last, result, iterator_category(result));
}
//以上的函数都有另外一个版本的,即提供binary_pred仿函数进行判断,这里就不列出了。
unique
template <class ForwardIterator>
ForwardIterator unique(ForwardIterator first, ForwardIterator last) {
  /* 先找到相邻重复元素的起点(这样可以省去前面不重复元素的比较,省时)
   * 然后调用unique_copy完成,由于新序列也就是原序列,所以最后导致的结果是末尾可能有残留的数据
   * 比如{0, 1, 2, 3, 3, 4, 5},结果就是{0, 1, 2, 3, 4, 5, 5}
   * 毕竟原序列的大小是不会变的
  first = adjacent_find(first, last);
  return unique_copy(first, last, first);
}

小结

关于stl_algo.h中的算法,除了一些没必要列出的还剩下一些较复杂的算法,这些算法我们放在另外的小节分析。

其实本小节分析的算法大多都比较简单,没有涉及到什么复杂的操作。不过像search以及reverse还有unique_copy这类还是值得一读的,因为涉及到迭代器的特性不同而采取了不同的方法进行处理,达到最佳效率的思想。

stl_algobase.h #ifndef __SGI_STL_INTERNAL_ALGOBASE_H #define __SGI_STL_INTERNAL_ALGOBASE_H #ifndef __STL_CONFIG_H #include #endif #ifndef __SGI_STL_INTERNAL_RELOPS #include #endif #ifndef __SGI_STL_INTERNAL_PAIR_H #include #endif #ifndef __TYPE_TRAITS_H #include #endif #include #include #include #include #include #ifdef __STL_USE_NEW_IOSTREAMS #include #else /* __STL_USE_NEW_IOSTREAMS */ #include #endif /* __STL_USE_NEW_IOSTREAMS */ #ifndef __SGI_STL_INTERNAL_ITERATOR_H #include #include #endif 立即下载

相关推荐

C++ STL库源代码(SGI版本)

C++ STL库源代码(SGI版本)

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

前言     在前面的博文中剖析了STL的数值算法、基本算法和set集合算法。本文剖析STL其它的算法,比如排序算法、合并算法、查找算法等等。在剖析的时候。会针对函数给出一些样例说明函数的使用。源代码出自SGI STL中的&lt;stl_algo.h&gt;文件。注:本文的源代码许多,可能兴许博文会对这些算法进行归类分析。 STL算法剖析 #ifndef __SGI_STL_...

weixin_34416754的博客 275

项目实训(四)——SAM模型的学习与部署

这里的show_mask就是我们用mask的prompt进行分割,show_points就是我们用points进行分割,show_box就是通过box进行分割,这是SAM的三种prompt的方式。总的来说,Meta AI 的 Segment Anything 模型为我们提供了一种全新的物体识别和分割方式,其强大的泛化能力和广泛的应用前景将极大地推动计算机视觉领域的发展。这里有vit_h、vit_b、vit_l三种权重模型,这里可以根据自己的需要下载相应的权重模型。我们是下载的vit_h权重模型。

yyyyyyyx_的博客 1421

五 STL算法(二)stl_algo.h

一  概述: 定义于SGI内的所有算法包含:heap算法(定义于中,stl_algo.h包含);set相关算法和其它的算法。 二 heap算法 (1)定义于中,被头文件#include。 (2)具体算法: *make_heap(): *push_heap(): *pop_heap(): *sort_heap(): 三 set相关算法(与常规的集合操作不同)

linux系统、网络编程和分布式计算 1120

带有验证码的爆破(包含Burp suite工具爆破)

关于含有验证码爆破的一些总结!

weixin_43960066的博客 8693

从零开始学习信号完整性(SIPI)--2

上一节我们已经谈过,信号完整性研究的是如何使驱动器输出的信号传输到接收器件并被正确的接收。 信号完整性的三要素包含了:信号、驱动接收芯片、传输通道。 这其中信号是主体,我们要做的主要工作就是设计好信号的传输路径为信号的正确传输扫清障碍。要做信号完整性分析与设计首先要了解信号的特性,以及信号质量的判别标准。 对一个信号进行描述通常需要如下几个指标: 信号特性的描述 摆幅:信号从低电平到高电平之间的电压差,对于单端信号通常由信号的供电电压决......

qq_29476769的博客 2万+

STL算法之基本算法<stl_algobase.h>

STL标准规格中没哟区分基本算法或复杂算法,然后SGI却把常用的一些算法定义于之中,其他算法定义于之中。以下一一列举这些基本算法。

chnming1987的博客 1325

Vensim系统动力学建模实战:从理论到仿真优化【案例详解】

本文详细介绍了Vensim在系统动力学建模中的实战应用,从基础理论到仿真优化全面解析。通过人口增长、供应链库存优化等典型案例,展示如何利用Vensim构建动态模型并进行参数优化,帮助读者掌握系统动力学建模的核心技术与实践技巧。

weixin_29231725的博客 476

SGISTL源码探究-stl_algo.h中的排序算法

前言在本小节中,我们将分析STL中算法组件的最后一部分:排序算法。排序算法分为内部排序和外部排序。而内部排序中常见的有八种排序算法:直接插入排序、希尔排序、简单选择排序、堆排序、冒泡排序、快速排序、归并排序、桶排序。在SGISTL实现的sort算法中,并不是简单的使用快速排序作为排序算法,而是交叉使用了插入排序、堆排序以及快速排序,并且做了一定的优化,并且只接受迭代器类型为RandomAccessI

Move_now的博客 938

Grok 3国内怎么用?超详细使用指南+实用指令模板

主要是用于快速分析学术论文,提取关键信息,总结研究成果。Analyze the following research paper: [粘贴或上传论文内容]1. Extract key findings, methodologies, and conclusions. (提取主要发现、方法和结论。2. Identify statistical significance and data points. (识别统计显著性和数据点。

Survivor_sl的博客 1万+

Moveit +Gazebo:搭建单臂机械臂仿真平台

Moveit +Gazebo:搭建单臂机械臂仿真平台

magic_invaid的博客 5290

SGISTL源码探究-stl_algo.h中的排列算法

前言在本小节中,我们将分析stl_algo.h中的排列算法。可能你使用过STL中的next_permutation求过全排列。比如这样:#include <iostream> #include <algorithm> #include <string> using namespace std;int main() { string str; cin >> str; sort(

Move_now的博客 924

Veritas NetBackup8.1.1客户端安装

1.在客户机打开安装包运行Browser 2.选择NetBackup Client Software Installation 3.下一步 4.接受,下一步 5.我选择自定义安装,下一步 6.我选择安装到D盘 7.默认下一步 8.使用域管理账户 9.输入服务器安装了服务端的那一台名称 10.输入服务端生成的令牌,选择“I recognize the fingerprint for this host.Proceed with the certificate deploymen”下一步

万物皆可学 2万+

SGISTL源码探究-STL中的算法(前言)

前言我们目前已经分析了STL中的六大组件的一半。剩下的还有算法、仿函数、配接器,已经分析了配置器、迭代器、容器部分。接下来进入到剩下的三大组件中最复杂的算法部分,关于STL中的算法,它实现了很多功能,但是分析这部分的时候我只打算选择一部分比较经典的算法进行分析(因为这部分的算法实在是太多了),只要掌握了分析的方法,以后自己遇到其他的STL算法或者感兴趣的,直接阅读源码就行了。概览大致分类STL中的算

Move_now的博客 589

Agent应用实践之三十六 - AgentScope高阶用法:AG-UI

AI 大模型飞速进化,不懂 AI、不会用 Agent 的程序员,正在慢慢被行业淘汰。现在 AI 新技术迭代快到离谱:RAG 还没学明白,MCP 接踵而来;工具刚上手,Skills、各类新 Agent 概念又轮番刷屏;Manus还没看懂,就出来OpenClaw,OpenClaw热度还没退,又出来Hermes。越追越乱、越学越焦虑,永远在被动跟风,陷入学不完、跟不上、用不上的内耗。其实焦虑的根本原因,不是新技术太多,而是不懂大模型 Agent 应用底层原理,只会零散跟风,没有通用方法论。为此我专门推出Agent

代码让AI扣 139

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SGISTL源码阅读 算法 前言

SGISTL源码阅读 算法 前言 STL有六大组件,我们已经分析了空间配置器、迭代器和容器,现在将进入对算法的学习。 STL中实现了很多极具复用价值的算法,排序(sorting),查找(searching),排列组合(permutation),用于数据移动、复制、删除、比较、组合、运算等的算法。所有STL算法都作用在由迭代器[first,last)所标示出来的范围内,在进入正式分析算法之前,我们先...

Lyn&Xx 391

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SGI STL源码学习

template class__default_alloc_template{     ...     // ROUND_UP() 将bytes上调至__ALIGN的倍数。     static size_tROUND_UP(size_t bytes) {         return (((bytes) + __ALIGN-1) & ~(__ALIGN - 1));  

记录点滴 663

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

STL源码分析之stl_algo.h中的基本算法

前言 上一节分析了stl_algo.h中的rotate函数实现, 本节我们继续分析该文件的中的其他基本算法, 这些算法功能实现看似很简单, 但是这些算法都能进行衍生, 用户自定义, 简单化了我们的部分编程, 直接使用无需再定义. 基本算法 for_each 将[first, last) 范围的元素由传入仿函数(函数)进行处理, 最后返回仿函数(函数). template &lt;class Inp...

啦啦啦 991

《STL源码剖析》 -- stl_algo.h

// Filename: // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http://blog.csdn.net/mdl13412 // 这个文件中定义了一些STL关键的算法

一个人的战争 4501

《STL源码剖析》---stl_algobase.h阅读笔记

STL标准中没有区分基本算法或复杂算法,单SGI把常用的一些算法定义在<stl_algobase.h>只中。在这些算法中,比较值得学习的是copy函数,它“无所不用其极”的改善效率。

KangRoger的专栏 2698

STL algorithm源码:stl_algo.h

// Algorithm implementation -*- C++ -*- // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, // 2010, 2011 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C

roaylchen的博客 6911

STL源码剖析——stl_algobase.h

STL标准中没有区分基本算法或复杂算法,单SGI把常用的一些算法定义在只中,其他算法定义在中。 stl_algobase.h中的算法,比较值得学习的是copy(),它“无所不用其极”的改善效率。copy的目的是复制一段元素到指定区间,复制操作最容易想到赋值操作符=,但是有的赋值操作符=是trivial的,可以直接拷贝。关于赋值操作符=是不是trivial的,可以参考“Member

Smile&搁浅 3763

《STL源码剖析》-- stl_hashtable.h

// Filename:    stl_hashtable.h // Comment By:  凝霜 // E-mail:      mdl2009@vip.qq.com // Blog:        http://blog.csdn.net/mdl13412

一个人的战争 4231

SGISTL源码探究-STL中的红黑树(上)

前言本小节将进入到SGISTL的红黑树部分。关于红黑树,是一种比较复杂的数据结构,但是并不是特别难。如果对红黑树不太了解,可以去网上查阅相关的资料,因为本文的主要目的是分析STL中的红黑树的源码,和普通的红黑树略有不同,还要复杂一些,需要有一定的基础。基本概念首先什么是二叉搜索树,二叉搜索树即符合任何一个节点的值一定大于其左子树的任何一个节点的值并且小于其右子树的任何一个节点的值(节点的值不允许重复

Move_now的博客 1806
上一篇: SGISTL源码探究-stl_algobase.h中的算法
下一篇: SGISTL源码探究-stl_alog.h中的二分查找算法
UKey_
博客等级 码龄10年 258粉丝 186原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值