![](https://img-blog.csdnimg.cn/012ac769360e4326900869f78dfeb8e1.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Effective STL
文章平均质量分 72
记录我看Effective STL时总结的经验,写该专栏的目的并不是把本书抄一次,而是总结出我能吸收掌握并且自己觉得有用的term,仅此而已,一起加油吧!
Fanfan21ya
累积所学所思,累积时间,冲冲冲~
展开
-
Term45:正确区分count、find、binary_search、lower_bound、upper_bound和equal_range。
前情提示:我个人认为本条款Term45是《Effective STL》这本书中最重要的一条term!它不仅告诉我们如标题所述的几种算法的具体使用的规范,还提醒我们,应该如何在使用STL容器时do规范的查找操作!假设我有一个容器,或者有一对迭代器标识了一个区间,now你希望在容器or区间中查找一些信息,这样的查找工作该如何进行呢?你的选择往往是:count、count_if、find、find_if、binary_search、lower_bound、upper_bound...原创 2022-02-03 20:44:40 · 737 阅读 · 0 评论 -
Term41:理解ptr_func、mem_fun、mem_func_ref的由来
给出一个问题:如果有一个函数f和一个对象x,现在我们希望在x上调用f,而在x的成员函数之外,为了执行这个调用操作,C++提供了3种不同的语法:f(x);//语法#1: f是一个non-member-funcx.f();//语法#2: f是一个member-func,x是一个对象or对象的引用px->f();//语法#3: f是一个member-func,且px是一个指向对象x的指针由于存在这3种不同的语法,因此在使用STL的一些组件时,不免会产生一些语法上...原创 2022-01-30 17:49:40 · 1102 阅读 · 0 评论 -
Term40:若一个类是函数子(functor),则应使它可配接(adaptable)
#include<iostream>#include<vector>#include<algorithm>#include<functional>using namespace std;struct myPred :public unary_function<int,bool>{//一个规范的Functor必须这么干!//因为这么干你的functor的通用型就更强! bool operator()(int v) { .原创 2022-01-30 00:10:37 · 1111 阅读 · 0 评论 -
对于map/multimap/unordered_map的学习使用理解
一、共同点:①map/multimap/unordered_map这三种标准的容器所存储的元素都是对组pair对组的定义方式: pair<T1,T2> p = make_pair(data1,data2);②都可以通过map[key] == value的方式来插入or访问键值对中的keyorvalue二、不同点:①map/multimap都是关联式容器,也即会给你自动do排序(默认为按照key值进行升序)这个工作,而unordered_map顾名思义就是无序的...原创 2021-10-05 17:04:19 · 238 阅读 · 0 评论 -
set_intersection、set_union、set_difference学习总结
本博客中,我们将学习并总结常用的集合算法。算法简介:set_intersection //求2个容器的交集set_union //求2个容器的并集set_difference //求2个容器的差集一、set_intersection(intersection是交集的意思,so这里是求2个容器的交集)功能描述: 求两个集合(容器)的交集函数原型:set_intersection(iterator beg1,iterator end1,iterator beg2,...原创 2022-01-27 16:03:30 · 1529 阅读 · 0 评论 -
Term30:确保目标区间足够大
本条款需要我们牢记的是:无论何时,如果所使用的算法(来自<algorithm>这个标准头文件)需要指定一个目标区间,那么必须确保目标区间足够大(用.reserve() or .resize()来do),或者确保它会随着算法的运行而增大,要在算法执行过程中增大目标区间,请使用插入型迭代器,比如back_iterator,front_iterator和inserter返回的迭代器。这些都是你需要记住的。test codes1:(向容器vector中添加新的对象)#inclu...原创 2022-01-25 15:38:30 · 539 阅读 · 0 评论 -
Term20:为包含指针的关联容器指定比较类型(important)
本条款告诉我们,当我们在关联式容器中存放指针类型的对象时,就应该自定义一个满足我们需求的比较器类型,也即编写一个用于比较的谓词(重载operator()符号且返回值为bool类型的一个类)。why?假设,我们有一个包含着string*指针的set,把一些动物名字push进去:set<string*> ssp2;// ssp: set of string ptrs!ssp2.insert(new string ("Anteater"));ssp2.in...原创 2022-01-19 17:03:36 · 932 阅读 · 0 评论 -
Term17:使用.swap()技巧来去除容器中多余的容量
某些时候,你的容器中可能需要存储相当多的元素,因此你push了大量的data进去一个容器中。但因为某些原因,你又pop了很多data出来。此时该容器就会占据大量的多余冗余的内存(容量) 为了避免容器中占用不再需要的内存,我们希望有一种方法能把它的容量从以前的最大值缩减到当前需要的数量。这种容器容量的缩减usually被称之为“shrink to fit”(压缩至适当大小),而实现这种shrink to fit缩减技巧的编程方法其实很简单,就是使用容器内置的方法.swap()...原创 2022-01-18 16:32:03 · 983 阅读 · 0 评论 -
Term13:vector和string优先于动态分配的数组
当你在写new T[N]的代码时,请一定要优先考虑使用STL中的vector容器orstring容器来代替你自己new的数组。可能你会问我为什么呢?Reason:当你决定用new来动态分配内存时,这意味着你将承担如下责任:①:你必须确保以后会有人用delete来删除所分配的内存。如果没有随后的delete,那么你的new将会导致资源泄露。②:你必须确保使用了正确的delete形式。如果分配了单个对象,则必须使用delete;如果分配了数组,则必须使用delete[...原创 2022-01-17 15:15:02 · 98 阅读 · 0 评论 -
Term14:使用reserve避免不必要的重新分配
对于STL容器,最了不起的一点就是,它们会自动增长以便容纳下你放入其中的数据。当然,这里有一个前提条件:你没有超出它们的最大限制条件(我们可以用名为max_size()的成员函数来知道这一最大限制数量)在Vs2022上,打下如下代码:vector<int> vec;cout << "vec.max_size() = " << vec.max_size() << endl;string str;cout << "str.max_siz原创 2022-01-17 15:00:18 · 443 阅读 · 0 评论