STL

深度剖析C++ STL vector容器的底层构造

学习了这么久的vector,想必读者对vector的底层原理一定充满好奇,为了满足读者的求知欲,本节将带领读者深入vector的学习,探寻其底层实现的奥秘。vector被称为动态数组,普通数组的promax版,动态扩展这一特性使得它与普通数组走上了截然不同的命运。下面我将提供其底层源码的一部分,有理有据地深入了解vector。template<typename_Tp,

C++ STL复制算法std::copy_if()函数入门

前面一节我们学习了复制算法copy_n()函数,读者是否还记得它的功能是什么吗?没错,该函数能够从指定位置开始复制固定数量的元素到目标区域。本节我们将学习一个更智能的复制算法——条件复制算法copy_if()函数。从名称就能看出,这个函数在复制时会进行条件筛选,只复制满足特定条件的元素。copy_if()函数的语法格式如下:template<classInputIt,

C++ STL 排序算法std::nth_element()函数入门

nth_element(beg , pos , end)排序算法模板函数,”nth“意为”第几个“,该排序算法指的是在指定区间[beg , end)按排序规则找出位置在pos上的元素是谁并进行填充,此函数会打乱原有序列。使用nth_element(beg ,pos , end)时需要包含头文件<algorithm>。使用nth_element(beg ,pos

深度剖析C++ STL无序关联式容器的底层构造

C++ STL无序关联式容器:unordered_map容器、unordered_multimap容器、unordered_set容器、unordered_multiset容器,其底层构造都是基于哈希表封装的。如果读者还不具备哈希基础的话可自行跳转《哈希算法实例详解》学习。简单来说,无序关联式容器可以看作指针数组+链表的奇妙组合。原理可理解为:我们向堆区开辟了一段连续空间(可理解为数组),空间大小

深入学习C++ STL list容器的迭代器

和其他容器一样,在学会创建容器后我们就要认识其迭代器。list同我们学过的vector一样,也有begin()、end()正向迭代器,rbegin()、rend()反向迭代器,更有可读不可改的cbegin()、cend()、crbegin()、crend()这种常量迭代器(c这里表示const,意为不可修改)。他们在链表中的位置如下图所示:list和之前学过的deque、vector、array一

浅谈C++ STL的发展史

1. 思想起源与早期探索(1970s - 1980s) STL 的核心理念源于其创始人 Alexander Stepanov 的长期思考:能否将算法从具体应用中抽象出来,且不损失运行效率?在莫斯科大学攻读数学后,Stepanov 与 David Musser 等人合作,先后使用 Tecton、Schema 和 Ada 语言进行泛型库

C++ STL替换算法std::replace()函数入门

前面一节我们学习了转换算法 transform() 函数,读者是否还记得它的功能是什么吗?没错,transform() 函数能够对序列中的元素进行转换操作并将结果存储到目标位置。本节我们将学习替换算法——replace()、replace_if() 和 replace_copy() 函数。"replace" 意为"替换",顾名思义,这些函数能够对序列中满足条

C++ STL序列查找算法std::search()函数入门

本节我们将继续进行序列查找的学习——search()函数。读者还记得我们之前学过的find_end()函数吗?如果忘记了可前往《C++ STL序列查找算法find_end()函数入门》自行学习。find_end()函数的功能是找寻主序列里最后一次出现子序列的位置,search()函数恰恰相反,search()函数的功能是找寻主序列里第一次出现子序列的位置。search(first1,last1,f

C++ STL map容器中,insert()和'[]'谁的插入效率更高?

在前面《如何为STL库中的map添加元素?》我们总结了4种方式为map容器插入元素,最常用的就是insert()和'[]'了。相必读者一定很好奇到底是谁的插入效率更高,用哪一个更好。这里先不直接公布答案,先看看直观的代码测试:#include<bits/stdc++.h>//万能头#include<string>#include<map>//

C++ STL vector容器入门

就普通数组而言,array不过是封装一个类的把戏罢了,只能称之为pro版数组;而对于vector来说,则是一台完美的重装坦克,升级为promax版数组,兼顾动态扩展和多种功能,成为算法竞赛上的常用数组容器。vector与前面两者不同,能够做到动态扩展,相比传统数组而言更加灵活。如果读者对array是否为动态数组而感到疑虑,则可自行跳转《千万别认为array容器是动态数组!》去一探究竟。vector