Effective STL
JF_Ma
好好学习,不断进步
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Effective STL 条款3
确保容器中的对象拷贝正确而高效在使用STL模板的时候,我们必须想到有关拷贝的问题。如果STL中存储的是我们自定义类型。可能会发生以下几个问题:首先为了避免拷贝过程成为程序运转的瓶颈,我们选择存储自定义的指针。但是,这里容易出现野指针的问题,所以我们需要使用智能指针shared_pre来避免。接着如果存储类型为基类,此时我们存储派生类,则会发生截断现象,即只copy了基类部分,而派生类部分丢失。最后相原创 2015-06-21 21:13:01 · 698 阅读 · 0 评论 -
Effective STL条款17-条款18
条款17:使用交换技巧来修正过剩容量本节条款告诉我们,如果你有一个vector的容器,容器的容量是10000,但是,现在只用了1,那么为了节省内存,我们应该只保留使用的vector容量,多余的容量应该释放。那么,怎么释放呢? 作者提供了一种方式,如下代码:vector<int> a;a.reserve(10000);a.push_back(1);vector<int>(a).swap(a);原创 2016-04-21 09:10:41 · 600 阅读 · 0 评论 -
Effective STL 条款15-16
条款15: 记住string实现的形式的多样性,即string的数据结构不是单一的,sizeof(string)的大小在不同的版本中是不同的。实际上每个string实现都容纳了下面的信息: 1:包含字符的数目 2:容纳字符的容量 3:构成字符串的字符 4:配置器的拷贝 5:这个值的引用计数本节的核心主旨就是string实现的多样性条款16:如何将vector和string兼容C风格的AP原创 2016-04-20 09:12:48 · 412 阅读 · 0 评论 -
Effective STL 条款31
本节条款让我们学到如何高效使用STL自带的排序算法本节条款的核心知识点如下: 1:如果你需要在vector、string、deque或者数组上进行完全排序,你可以使用sort或者stabl_sort2:如果你有一个vector、string、deque或者数组,你只需要排序前n个元素,应该用partial_sort3:如果你有一个vector、string、deque或者数组,你需要鉴别出第n个元原创 2016-05-04 08:56:09 · 609 阅读 · 0 评论 -
Effective STL 条款14
使用reserve来避免不必要的重新分配本节讲解reserve操作的优势,以及重新分配的代价先来讲一下重新分配的代价: 1.分配新的内存块,一般vector和string是成倍增加内存2.把所有元素从容器的旧内存拷贝到它的新内存3.销毁旧内存对象4.回收旧内存可以看出,重新分配内存的操作是非常耗时的。接着,解释一下以下几个迭代器函数的功能:1.size告诉你容器中有多少元素2.capacity告诉原创 2016-04-19 09:13:49 · 378 阅读 · 0 评论 -
Effective STL 条款12
对STL容器线程安全性的期待现实一点本节讲解STL容器对于线程安全性的知识。STL容器中明确规定有两条: 1:多线程可以同时安全读取同一个容器。 2:多线程可以同时写入不同容器。以上两条就是STL对容器仅有的线程方面的说明。第一条的意思是说对于同一个容器,可以满足多个使用者同时读取。第二条的意思是不同的容器可以被同时写入,也就是不同容器之间并没有关联性。现在的多线程的程序越来越多,随着多核处理器原创 2016-04-18 09:17:31 · 350 阅读 · 0 评论 -
Effective STL 条款9
在删除选项中仔细选择本节核心内容: 如何高效的删除容器中的指定数据结论如下: 1.去除一个容器中有特定值的所有对象如果容器是vector,string或者deque,使用erase-remove惯用法。如果容器是list,使用list::remove如果容器是标准关联容器,使用它的erase成员函数2:去除一个容器中满足一个特定判定式的所有对象:如果容器是vector,string或者deque原创 2016-04-15 08:59:34 · 440 阅读 · 0 评论 -
Effective STL 条款8
永不建立auto_ptr的容器首先,我们应该明白什么是auto_ptr,其实auto_ptr你可以认为是一种类型容器,auto_ptr类型容器有什么特点呢?当你拷贝一个auto_ptr的时候,auto_ptr所指对象的所有权被转移到拷贝的auto_ptr对象,而被拷贝的auto_ptr被自动设为NULL.如下代码:auto_ptr<widget>pw1(new widget);auto_ptr<wi原创 2016-04-14 08:55:59 · 442 阅读 · 0 评论 -
Effective STL 条款5
尽量使用区间成员函数代替它们的单元素兄弟本节重点论述区间成员函数的优势.首先,我们需要知道什么是区间成员函数,区间成员函数如下举例:insert(v1.begin(),v2.begin(),v2.end())assign(v1.begin(),v2.begin(),v2.end())erase(v1.begin(),v2.begin(),v2.end())....那什么是它的单元素兄弟呢?如下:1:原创 2016-04-10 12:45:27 · 391 阅读 · 0 评论 -
Effective STL 条款4
STL作为标准模板库,是程序员开发的利器,但是,在使用的过程中会因为使用不当,降低STL的效率。本节就是一个简单的效率讨论,很简单,对于序列容器来说,如果你的目的是判断一个容器对象中是否有元素,有两种方法。分别如下:方法一:container a;if(0==a.size())方法二:container a;if(a,empty())那么,相对来说,这两个语句之间的区别在哪? 如果对于vecto原创 2016-04-10 11:14:09 · 372 阅读 · 0 评论 -
Effective STL 条款7
使用容器的时候 ,要避免内存泄露众所周知,使用容器的好处是我们不用考虑容器的内存问题,容器本身具有自动内存管理的能力,包括动态申请内存和释放内存。但是,当你存储的对象是指针的时候,你就要注意内存的人工释放了。 如下代码:void doSomething(){ vector<Widget*>vwp; for(int i=0;i<num;i++) { vwp.p原创 2016-04-13 09:05:48 · 416 阅读 · 0 评论 -
Effective STL 条款6
本节的重点是有关C++语句解析的讨论看一段代码:1:int f(double d);2:int f(double (d));3:int f(double);上面的三种函数声明的形式有区别吗? 回答没有,对的,当然没有,只不过形式不同而已。 再看下面这个片段class A{....};A a();请问上面片段中的a是类对象还是返回一个类A类型的函数? 答案是难以判定的,它既符合调用无参构原创 2016-04-12 09:20:33 · 479 阅读 · 0 评论 -
Effective STL 条款2
不要试图编写独立于容器类型的代码本节条款作者想要表达的意思很简单,就是我们不应该认为容器很完美,不能在编写新的容器时涵盖所有特性,这么做是不现实的,要根据程序需求,提取出关键需求特性。我们为了以后灵活的改动程序或者简化编程要经常用typedef关键字。 如下代码:#include<iostream>#include<vector>using namespace std;class What{原创 2015-06-05 19:01:40 · 634 阅读 · 1 评论 -
Effective STL 条款1:仔细选择你的容器
条款1:仔细选择你的容器了解各种容器的实现方法,知道各种容器的内存管理方式、各种操作所对应的底层操作,然后根据需要选择恰当的容器。对于容器的分类:标准STL序列容器:vector,string,deque和list 标准STL关联容器:set,multiset,map和multimap 非标准序列容器:slist(单向链表)和rope(重型字符串——不懂) 非标准关联容器:hash_set,h原创 2015-06-05 18:34:11 · 643 阅读 · 1 评论 -
Effective STL 条款20
为指针的关联容器指定比较类型举个书上的例子:set<string*>ssp;ssp.insert(new string("Anteater"));ssp.insert(new string("Wombat"));ssp.insert(new string("Lemur"));ssp.insert(new string("Penguin"));for(set<string*>::const_i原创 2016-04-25 09:16:05 · 404 阅读 · 0 评论
分享