![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++ STL
文章平均质量分 63
必成桂
资深码农一枚
展开
-
C++ STL vector实现(二)
上一篇我们讨论了vector的声明,接下来您将看到的是vector的接口和实现。 class vector { public: ... iterator begin() { return start; } //返回vetor的首 const_iterator begin() const { return start; } //只读访问 itera原创 2009-04-26 09:55:00 · 8413 阅读 · 4 评论 -
effective STL - 尽量使用vector和string来代替动态分配的数组(char *)
尽量使用vector和string来代替动态分配的数组这一刻,你决定使用new来进行动态分配,你需要肩负下列职责:你必须确保有的人以后会delete这个分配的内存。如果后面没有delete,你的new就会产生一个内存泄漏。你必须确保使用了delete的正确形式。对于分配一个单独的对象,必须使用“delete”。对于分配一个数组,必须使用“delete []”。如果使用了d翻译 2009-10-17 20:08:00 · 3038 阅读 · 0 评论 -
使用vector::reserve来避免不必要的重新分配
关于STL容器,最令人称赞的特性之一就是是只要不超过它们的最大大小,它们就可以自动增长到足以容纳你放进去的数据。(要知道这个最大值,只要调用名叫max_size的成员函数。)对于vector和string,如果需要更多空间,就以类似realloc的思想来增长大小。这个类似于realloc的操作有四个部分:分配新的内存块,它有容器目前容量的倍数。在大部分实现中,vector和string原创 2009-10-17 20:32:00 · 7884 阅读 · 1 评论 -
effective STL - 小心string实现的多样性
Bjarne Stroustrup曾经用奇特的标题写一篇文章,《Sixteen Ways to Stack a Cat》[2。事实表明实现string几乎有和那一样多的方法。当然,作为有经验而且老于世故的软件工程师,我们应该忽视“实现细节”,但是如果爱因斯坦是对的,上帝存在于细节里,现实要求我们有时皈依宗教。即使当细节不重要的时候,对它们有一些了解使我们能够确信它们不重要。例如原创 2009-10-17 21:49:00 · 1479 阅读 · 0 评论 -
effective STL - 了解相等和等价的区别
STL有许多比较对象是否有同样的值的情况。比如,当你用find来定位区间中第一个有特定值的对象的位置,find必须可以比较两个对象,看看一个的值是否与另一个相等。(operator==)。同样,当你尝试向set中插入一个新元素时,set::insert必须可以判断那个元素的值是否已经在set中了。find算法和set的insert成员函数是很多必须判断两个值是否相同的函数的代表。但原创 2009-10-19 22:00:00 · 1837 阅读 · 0 评论 -
Effective STL 条款21: 关联容器的strict weak order(让比较函数对相等的值返回false)
条款21: 永远让比较函数对相等的值返回false让我向你展示一些比较酷的东西。建立一个set,比较类型用less_equal,然后插入一个10:set > s; // s以“<=”排序s.insert(10); // 插入10现在尝试再插入一次10:s.insert(10);对于这个insert的调用,set必须先要判断出10是否已经位于其中了。翻译 2009-10-20 21:38:00 · 6219 阅读 · 1 评论 -
Effective STL: 考虑用已序vector代替关联容器
条款23:考虑用已序vector代替关联容器当需要一个提供快速查找的数据结构时,很多STL程序员立刻会想到标准关联容器:set、multiset、map和multimap。直到现在这很好,但不是永远都好。如果查找速度真得很重要,的确也值得考虑使用非标准的hash容器。如果使用了合适的hash函数,则可以认为hash容器提供了常数时间的查找。(如果选择了不好的hash函数或表的太小,has翻译 2009-10-21 22:14:00 · 1671 阅读 · 0 评论 -
Effective STL- 需要一个一个字符输入时考虑使用istreambuf_iterator
条款29:需要一个一个字符输入时考虑使用istreambuf_iterator假设我们要把一个文本文件拷贝到一个字符串对象中。似乎可以用一种很有道理的方法完成:ifstream inputFile("interestingData.txt");string fileData((istream_iterator(inputFile)), // 把inputFile读入 i翻译 2009-10-21 23:12:00 · 7987 阅读 · 0 评论 -
Effective STL - 为指针的关联容器指定比较函数
条款20:为指针的关联容器指定比较函数假定你有一个string*指针的set,你把一些动物的名字插入进set:set ssp; // ssp = “set of string ptrs”ssp.insert(new string("Anteater"));ssp.insert(new string("Wombat"));ssp.insert(new string翻译 2009-10-20 21:10:00 · 2207 阅读 · 0 评论 -
effective STL - 避免原地修改set和multiset的键
条款22:避免原地修改set和multiset的键本条款的动机很容易理解。正如所有标准关联容器,set和multiset保持它们的元素有序,这些容器的正确行为依赖于它们的有序性。如果你改了关联容器里的一个元素的值(例如,把10变为1000),新值可能不在正确的位置,而且那将破坏容器的有序性。很简单,是吗?这对于map和multimap特别简单,因为试图改变这些容器里的一个键值的程序将不翻译 2009-10-20 21:51:00 · 3818 阅读 · 0 评论 -
Effective STL- 熟悉非标准的散列容器(hash 容器)
条款25:熟悉非标准散列容器STL程序员一般用不了多久就开始惊讶,“vector、list、map,很好,但是散列(hash)表在哪里"?唉,在标准C++库里没有任何散列表。 每个人都同意这是个不幸,但是标准委员会觉得需要加给他们的工作可能会过渡地推迟标准的完成。可以肯定标准的下一个版本将包含散列表,但是目前,STL没有散列的东西。但是如果你喜欢散列表,那么振作起来。你不需要放弃或自翻译 2009-10-21 22:21:00 · 2230 阅读 · 0 评论 -
more effective c++第二章读书笔记:c++的运算符,运算符转换,前缀自增和后缀自增,operatpr new和operator delete.
条款5:小心用户自定义的转换函数 c++允许编译器在两种数据类型之间进行隐式类型转换。(implicit conversion).首先,c++继承了c语言的类型转换的策略。除了这个,c++还有两种隐式转换: 单个参数的构造函数,以及隐式的类型转换运算符。单个参数的构造函数是指只传递给它一个参数就可以调用的构造函数,这种构造函数可能只定义一个参数,也可以定义多个参数,定义多个参数的时原创 2009-11-09 23:38:00 · 1852 阅读 · 1 评论 -
用vector来实现matrix。
众所周知,c++没有提供默认的matrix(矩阵)类型。不过大部分时候我们可以沿用c的用法,可以声明一个二维数组来声明matrix。本文描述了另外一种方法,来实现一个matrix类,表达一个二维数组的概念,具体的实现是二维的vector。 #ifndef MATRIX_H#define MATRIX_H #include using std::vecto原创 2010-04-22 23:20:00 · 6216 阅读 · 0 评论 -
CArray随想
<br />CArray的性能和用途均低于vector<br />今天测试了一下,有什么理由不用vector呢?原创 2011-04-21 12:22:00 · 970 阅读 · 0 评论 -
MFC设置对话框的焦点
方法有二: 1. 设置对话框控件的tab order。 按Ctrl+D即可看见。将需要被设置到焦点的空间的tab order设为1.2. 对话框的OnInitDialog返回FALSE。解释如下:(摘抄至msdn) If OnInitDialog returns nonzero, Windows sets the input focus to the first c原创 2012-03-29 17:12:54 · 8428 阅读 · 0 评论 -
设计模式之工厂模式
工厂模式只适用于对象的创建。说白了就是封装了new‘一个对象的操作。简单工厂模式1. 目的 工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式。它定义一个用于创建对象的接口,由子类决定实例化哪一个类。2 . 简单工厂模式的结构 3. 一个简单例子java 代码// 产品接原创 2012-04-02 11:43:56 · 2746 阅读 · 0 评论 -
effective STL : 使用“交换技巧”来修整过剩容量
条款17:使用“交换技巧”来修整过剩容量假设你正在为TV游戏秀《Give Me Lots Of Money — Now!》写支持软件,而且你要跟踪可能的竞争者,你把它们保存在一个vector中:class Contestant {...};vector contestants;当这个秀需要一个新的竞争者时,它将被申请者淹没,你的vector很快获得很多元素。但是秀的制作人原创 2009-10-17 22:02:00 · 1305 阅读 · 0 评论 -
如何使用STL PriorityQueue 优先队列
相信大家对优先队列不陌生。STL提供的PriorityQueue属于容器适配器,底层默认用vector容器来实现。实现原理是在用vector里构造一个Heap(堆),堆一般是用数组来储存的。下面是一个使用有限队列的例子,用来实现一个错误关联器,总是把优先级高的错误放在最前面。#include #include #include #include // this cl原创 2009-10-15 15:07:00 · 3411 阅读 · 0 评论 -
list::splice()函数详解
list::splice实现list拼接的功能。将源list的内容部分或全部元素删除,拼插入到目的list。函数有以下三种声明:void splice ( iterator position, list& x ); // void splice ( iterator position, list& x, iterator i );void splice ( iterator原创 2009-10-15 12:11:00 · 68282 阅读 · 6 评论 -
STL vector实现(一)
作者放弃对本文的任何权利。任何人都有权转载,修改,分发。转载请注明出处。作者对本文不承担任何责任。 假定你现在已经能熟练使用vector,如果你很好奇vector背后是怎么实现的,那么本文或许对你能有所帮助。 vector代表了c++的动态数组,大小是动态可增长的。你不必考虑自己手动分配或释放内存,也不必担心内存泄漏,vector帮你做了这一切。vector的使用很简单,但是要做到原创 2009-04-24 11:51:00 · 5236 阅读 · 2 评论 -
STL Map使用详解(一)
Map是一种关联容器,用来存储key-value数据。其中的key是用来查找的关键字,value是实际存放的值。一个特定的关键字只能与一个唯一的值相联系。map是由一对一对的键值(key/value)所组成的排序结构体,键值是读一无二的(unique)的。 map通常是以平衡二叉查找树来实现的,因此map对插入,删除,查找能保证log(N)的时间复杂度。对于海量的数据的插入和原创 2009-05-25 20:59:00 · 19698 阅读 · 1 评论 -
STL Map使用详解(二)
Map的删除 STL Map的删除能保证平均对数时间复杂度。函数erase可以用来删除map的一个元素,也可以删除一个范围内的元素。 iterator erase( iterator _where ); //删除iterator指向的元素 iterator erase( iterator range_start, iterator range_end); //删除从st原创 2009-05-26 21:35:00 · 14110 阅读 · 0 评论 -
STL高效编程(二)- 注意容器的不同特点,小心容器无关的代码
STL是建立在泛型之上的。数组泛型为容器,以对象类型为参数。函数泛型成算法,以迭代器类型为参数。指针泛型为迭代器,参数化了所指向的对象的类型。 这只是个开始。独立的容器类型泛化为序列或关联容器,而且类似的容器拥有类似的功能。标准的以连续内存为实现的容器都提供随机访问迭代器,标准的基于节点的容器都提供双向迭代器。序列容器支持push_front或push_back,但关联容器不支持。关原创 2009-08-26 22:18:00 · 1125 阅读 · 0 评论 -
STL高效编程(-) STL的容器
STL有很多概念,迭代器,高效的算法,函数对象,但是对于大多数的开发者而言,STL最突出的地方还是容器(Container),容器远远比数组强大和灵活。 容器可以动态增长,独立管理内存,提供对容器元素的高效的灵活的访问,等等。STL容器是有效的封装最常见的数据结构和算法,在我看来,STL容器就是代表着c++的数据结构,从数组,链表,栈,队列,表,哈希表。每一个容器代表着一种数据结构。原创 2009-08-25 22:47:00 · 2319 阅读 · 0 评论 -
STL List 实现(1)
List作为STL的代表链表的容器,相信大家都不会陌生。本文将讨论一个List容器的一个主流实现。 STL List容器在底层一般是用(双链表)double-linked list来实现的,管理着一个又一个的结点。如果你有双链表的基础知识,那么这篇文章对你来说应该不会太难。与vector一样,List容器采用了普遍的内存管理器allocator来管理内存,维护着底层的双链表的表头和表原创 2009-06-22 18:32:00 · 8674 阅读 · 0 评论 -
STL高效编程(三)-使容器元素的拷贝正确和高效
首先,你必须要明白的是,容器容纳着许多对象,但不是你传给它的那些原始对象,而是对象的拷贝。 此外,当你从容器中获取一个对象时,得到的不是容器里的那个对象,而是对象的拷贝。同样的,当你向容器中添加一个对象时(通过insert或push_back),添加到容器的是你给的对象的拷贝。copy进去,copy出来,这就是STL的方式。所以,STL要求对象必须是可拷贝的。对象被存到容器里之后,对原创 2009-08-27 23:16:00 · 2544 阅读 · 2 评论 -
effective STL 当容器里储存指针时,记得要手动释放
条款7:当使用new得指针的容器时,记得在销毁容器前delete那些指针STL中的容器非常优秀。它们提供了前向和逆向遍历的迭代器(通过begin、end、rbegin等);它们能告诉你所容纳的对象类型(通过value_type的typedef);在插入和删除中,它们负责任何需要的内存管理;它们报告容纳了多少对象和最多可能容纳的数量(分别通过size和max_size);而且当然当容器自己翻译 2009-09-19 23:25:00 · 3135 阅读 · 0 评论 -
effective STL STL的内存适配器
分配器是怪异的。它们最初是为抽象内存模型而开发的,允许库开发者忽略在某些16位操作系统上near和far指针的区别(即,DOS和它的有害产物),但努力失败了。分配器也被设计成促进全功能内存管理器的发展,但事实表明那种方法在STL的一些部分会导致效率损失。为了避免效率冲击,C++标准委员会向标准中添加了词语,把分配器弱化为对象,同时也表达了他们不会让操作损失能力的希望。还有更多。正如ope翻译 2009-09-21 23:17:00 · 796 阅读 · 0 评论 -
Effective STL - 不要把auto_ptr放在容器里
坦白地说,本条款不需要出现在《Effective STL》里。auto_ptr的容器(COAPs)是禁止的。试图使用它们的代码都不能编译。C++ 标准委员会花费了无数努力来安排这种情况[1]。我本来不需要说有关COAPs的任何东西,因为你的编译器对这样的容器应该有很多抱怨,而且所有那些都是不能编译的。 唉,很多程序员使用STL平台不会拒绝COAPs。更糟的是,很多程序员妄想地把翻译 2009-09-19 23:41:00 · 2152 阅读 · 0 评论 -
effective STL 关于STL容器的线程安全特性
标准C++的世界是相当保守和精简的。在这个纯洁的世界,所有可执行文件都是静态链接的。不存在内存映射文件和共享内存。没有窗口系统,没有网络,没有数据库,没有进程。在这种情况下,当发现标准没有提到任何关于线程的东西时你不该感到惊讶。你对STL的线程安全有的第一个想法应该是这取决于STL的实现。 当然,多线程程序是很普遍的,所以大部分STL厂商努力使他们的实现在线程环境中可以正常工作。但是翻译 2009-09-22 23:14:00 · 4016 阅读 · 0 评论 -
Effective STL - 警惕c++让人懊恼的解析
假设你有一个int的文件,你想要把那些int拷贝到一个list中。这看起来像是一个合理的方式:ifstream dataFile("ints.dat");list data(istream_iterator(dataFile), // 警告!这完成的并不 istream_iterator()); // 是像你想象的那样这里的想法是传一对istream_iterator翻译 2009-09-19 23:11:00 · 1071 阅读 · 0 评论 -
STL list实现(二)
STL list实现(2) 在之前的一篇文章里,讲述了list的声明和部分函数的实现。(请参考stl list实现一)在这一篇文章里 ,将向大家介绍一些常用函数的实现。 一. List的删除:list支持删除所有指定的值。 记住,list的remove的参数为VALUE,不支持参数为iterator.Erase的参数为迭代器。为什么remove()和eras原创 2009-09-29 15:43:00 · 2589 阅读 · 0 评论 -
如何从vector里删除元素(erase的副作用)
现在用stl的人越来越多, stl确实是套很漂亮的算法和数据结构库. 但是初用stl的人往往会遇上很多问题.从一个容器中删除元素,是很常用的操作,但是也是初学者常会犯错误的地方,上次baosong就发现了删除map和list中元素会犯的错误. vector是stl里很常用的一个容器, 和map,list等容器相比, 从vector中删符合某些条件的元素有更多的麻烦.比如,我们要完成如下的任务转载 2009-10-15 10:20:00 · 7673 阅读 · 2 评论 -
STL容器中元素的具体需求
STL容器对元素使用的是值语义(valuesemantics). 也就是说,容器会储存要添加的元素的副本。并且在需求时返回这些元素的副本。容器还可以利用赋值运算符对元素赋值。以及调用析构函数销毁元素。因此,在编写一个可用于STL容器的类时,必须要求是可拷贝的。(copyable). 如果你倾向于使用引用语义,此时你需要保存元素的指针而不是元素的值。容器复制一个指针的时候,也是简单原创 2009-10-14 11:45:00 · 1062 阅读 · 0 评论 -
免费c++图片操作库(类)
OpenCV:功能十分的强大,而且支持目前先进的图像处理技术,体系十分完善,操作手册很详细,手册首先给大家补计算机视觉的知识,几乎涵盖了近10年内的主流算法;然后将图像格式和矩阵运算,然后将各个算法的实现函数。我用它来做了一个Harris角点检测器和Canny边缘检测器,总共就花了一个小时(第一次用OpenCV)。而且该库显示图像极其方便,两句话就可以。但该库似乎不大稳定,对32F和16S、8U的原创 2012-10-08 10:29:00 · 7392 阅读 · 0 评论