STL
文章平均质量分 79
SzMing
这个作者很懒,什么都没留下…
展开
-
SGI_STL_空间配置器
一般而言,我们习惯C++内存申请操作和释放操作如下:class Foo{};Foo * pf = new Foo; //1.申请空间2.调用构造函数delete pf; //1.析构函数2.释放空间 但是为了精确分工,STL Allocator这两个阶段分开来。PS:以下代码不讨论多线程情况内存申请:alloc::allocate()负责。原创 2012-12-10 11:45:19 · 603 阅读 · 0 评论 -
C++ 模板类型萃取技术 第二部分 基于泛型的类型萃取技术
总结一下,我们之所以要萃取迭代器相关的类型,无非是要把迭代器相关的类型用于声明局部变量、用作函数的返回值等一系列行为。对于原生指针和point-to-const类型的指针,采用模板偏特化技术对其进行特殊处理,另外,对于point-to-const类型的指针,为了保证声明左值时语义正确,特化时按照普通原生指针处理。实际上,把我们刚才的例子提炼一下,迭代器相应类型不仅仅有迭代器封装的对象类型,ST转载 2012-11-14 12:44:58 · 456 阅读 · 0 评论 -
STL约束器原理
//函数对象基类templatestruct unary_function{typedef Arg argument_type;typedef Res result_type;}templatestruct binary_function{typedef Arg first_argument_type;typedef Arg2 second_argument_type;转载 2012-11-14 13:06:41 · 556 阅读 · 0 评论 -
STL中的约束器相关总结
摘要: STL里有仿函数的概念,而在应用仿函数的时候,仿函数与仿函数之间的适配引出了约束器的概念。这一节主要叙述一下一元函数对象基类unary_function、二元函数对象基类binary_function,以及两个约束器binder1st与binder2nd,同时给出一个场景,分析实现原理。1:template class Arg, class Result> struct转载 2012-11-14 13:01:14 · 564 阅读 · 0 评论 -
C++ STL set和multiset的使用
1,set的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就 像一个集合一样。所有的操作的都是严格在logn时间之内完成,效率非常高。 set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同。 创建 multiset base; 删除:如果删除元素a,那么在定义的比较关系下和a相等的所有元素都会被转载 2012-11-14 23:09:55 · 389 阅读 · 0 评论 -
list::remove_if和泛型算法remove_if浅析
remove_if有两种,一种是list等容器的方法list::remove_if,另一种是泛型算法中的remove_if方法,原型就不详细说了,可以去查MSDN。其中list::remove_if只有一个参数,即一个一元谓词,为真时执行删除操作,这里的“删除”是真正删除了元素项,无需在后续中使用erase()方法,而且函数没有返回值;而泛型算法的remove_if方法可以设定删除范围,比如对转载 2012-11-14 13:22:30 · 2429 阅读 · 0 评论 -
C++ 模板类型萃取技术 第一部分 为什么要有萃取技术
自从C++中引入了template后,以泛型技术为中心的设计得到了长足的进步。STL就是这个阶段杰出的产物。STL的目标就是要把数据和算法分开,分别对其进行设计,之后通过一种名为iterator的东西,把这二者再粘接到一起。设计模式中,关于iterator的描述为:一种能够顺序访问容器中每个元素的方法,使用该方法不能暴露容器内部的表达方式。可以说,类型萃取技术就是为了要解决和iterator有关的转载 2012-11-14 12:44:14 · 606 阅读 · 0 评论 -
std::unary_function 和 std::binary_function.
要将书写函数对象的进程简单化, 标准库提供两个类模板作为这样的对象的基类: std::unary_function 和 std::binary_function. 它们都在头文件 中声明. 根据其命名, unary_function 提供接收一个参数的基函数而 binary_function 提供一个接收两个参数的基函数.unary_functio原创 2012-11-14 01:01:53 · 2898 阅读 · 0 评论 -
详细解说 STL 排序(Sort)
0 前言: STL,为什么你必须掌握对于程序员来说,数据结构是必修的一门课。从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来。幸运的是这些理论都已经比较成熟,算法也基本固定下来,不需要你再去花费心思去考虑其算法原理,也不用再去验证其准确性。不过,等你开始应用计算机语言来工作的时候,你会发现,面对不同的需求你需要一次又一次去用代码重复实现这些已经成熟的算原创 2012-11-13 19:12:36 · 382 阅读 · 0 评论 -
妙用for_each算法函数
for_each函数原形templateclass _InIt, class _Fn1> inline _Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func) { // perform function for each element for (; _ChkFirst != _Chk原创 2012-11-13 12:15:30 · 400 阅读 · 0 评论 -
list::splice()函数详解
list::splice实现list拼接的功能。将源list的内容部分或全部元素删除,拼插入到目的list。函数有以下三种声明:void splice ( iterator position, list& x ); //void splice ( iterator position, list& x, iterator i );void splice ( iter转载 2012-11-13 12:21:32 · 486 阅读 · 0 评论 -
STL中map与hash_map容器的选择
先看看alvin_lee 朋友做的解析,我觉得还是很正确的,从算法角度阐述了他们之间的问题!实际上这个问题不光C++会遇到,其他所有语言的标准容器的实现及选择上都是要考虑的。做应用程序你可能觉得影响不大,但是写算法或者核心代码就要小心了。今天改进代码,顺便又来温习基础功课了。 还记得Herb Sutter那极有味道的《C++对话系列》么,在其中《产生真正的hash对象》这个转载 2012-11-12 21:46:06 · 489 阅读 · 0 评论 -
关于reverse_iterator
这个reverse_iterator曾经搞得我头大,其对应的函数也是那么的可不理解...现在一切都好了.对于left_null>1->2->3->4->right_null,这样一个有4个元素(1,2,3,4)的链表.1->2->3->4->尾listiteraotr c1=intList.begin() // *c1=1;listiteraotr c2=intL转载 2012-11-12 15:35:41 · 358 阅读 · 0 评论 -
Allocator空间分配器一
Allocator空间分配器一一 简介Allocator分配器是STL的重要组件,负责为容器Container中的元素分配和释放空间,前面也说过将Allocator独立出来的好处就是可以实现不同的分配策略,因而可以根据需要使分配尽可能的最优化;而且这也使定制自己的分配器成为可能。Allocator分配的空间不一定就是内存,你可以从任何可行的地方分配内存,比如磁盘。 二 Allo转载 2012-11-15 18:06:16 · 465 阅读 · 0 评论 -
Allocator空间分配器二
STL Allocator空间分配器二 今天把SGI提供的Allocator分配器仔细看了下,其设计还是相当精巧的。不过SGI的分配器已经脱离了STL标准,比如它就没有实现construct()和destroy()成员函数。 一 简单malloc分配器对于大于128B的空间直接就是malloc()和free()了,没有什么特殊的;不过它还是仿造C++的new handler形式转载 2012-11-15 18:07:13 · 572 阅读 · 0 评论 -
STL六大组件
1 containers(容器),各种基本资料结构如 vector, list, deque, set, map┅,共约 11 种。其中有些亦被归类为 adaptors。 2 algorithms(演算法),各种基本演算法如 sort, search, copy, erase┅,共约 70 个。 3 iterators(迭代器):应用於容器与演算法身上的一种泛型指标,扮演两者间转载 2012-11-15 18:10:17 · 481 阅读 · 0 评论 -
各种容器特点总结—容器的选择问题
(1) vector内部数据结构:数组。随机访问每个元素,所需要的时间为常量。在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存。vector的迭代器在内存重新分配时将失效(它所指向的元素在该操作的前后不再相同)。当把超过capacity原创 2012-12-08 13:29:41 · 800 阅读 · 0 评论 -
STL 容器适配器
标准库提供了三种顺序容器适配器:queue、priority_queue、stack.适配器是标准库中通用的概念,包括容器适配器、迭代器适配器和函数适配器。 本质上,适配器是使一事物的行为类似于另一类事物的行为的一种机制。容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现。例如,stack适配器可使任何一种顺序容器以栈的方式工作。如下列出了所有原创 2012-12-08 12:14:23 · 617 阅读 · 0 评论 -
ostream_iterator详细解析
ostream_iterator属于I/O流STL适配器,用于获取一个元素,同时保存在缓冲器中,可以供Cout输出。如果把cout看做成一个对 象,那么在Cout对象当中存在一片用于数据存储的区域。ostream_iterator在STL中一般配合copy函数一起使用,如下代码; ostream_iterator output(cout, " "); //关联cout,设置原创 2012-12-08 12:07:52 · 826 阅读 · 0 评论 -
学STL谈Deque容器(二)
Deque容器操作综合实例代码: #include #include #include #include using namespace std; int main() { dequecoll; coll.assign(3,string("string")); coll.push_back("last string"); coll.push_fr原创 2012-12-08 12:04:46 · 517 阅读 · 0 评论 -
学STL谈Vector容器(一)
Vector容器操作综合实例代码: #include #include #include #include using namespace std; int main() { vector sentence; sentence.reserve(5); sentence.push_back("Hello,"); sentence.push_back原创 2012-12-04 22:11:45 · 576 阅读 · 0 评论 -
GetMemory()函数
NO1void GetMemory(char *p){ p=(char *)malloc(100);}void Test(){ char * str=NULL; GetMemory(str); strcpy(str,"Hello world"); printf(str);}原创 2012-11-20 11:27:12 · 845 阅读 · 0 评论 -
traits编程方法
侯捷老师在《STL 源码剖析》说:traits编程方法是一把开启STL源代码大门的钥匙,其重要性也就不必再说了。既然traits编程方法如此重要,那么掌握并领悟其精髓是相当必要了。 trait的意思是什么?英文意思是attribute,feature等等,中文意思可以解释为特点, 特性。那么type trait就是类型的特性。那什么是类型?类型的特性又有哪些呢?类型也即是用户自定义的类型转载 2012-11-18 16:20:12 · 567 阅读 · 0 评论 -
细数C++ STL 的那些事---set(元素唯一,且排序)
1)Set是一种关联容器,它用于存储数据,并且能从一个数据集合中取出数据。它的每个元素的值必须唯一,而且系统会根据该值来自动将数据排序。每个元素的值不能直接被改变。 【重点】内部结构采用红黑树的平衡二叉树 multiset 跟set 类似,唯一的区别是允许键值重复!!! 2)使用转载 2012-11-18 15:27:32 · 940 阅读 · 0 评论 -
C++迭代器 iterator
1. 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型。(1) 每种容器类型都定义了自己的迭代器类型,如vector:vector::iterator iter;这条语句定义了一个名为iter的变量,它的数据类型是由vector定义的iterator类型。(2) 使用迭代器读取vector中的每一个元素:vector ivec(10,1);for(vector转载 2012-11-17 18:07:04 · 461 阅读 · 0 评论 -
Traits编程技法一
Traits编程技法按照顺序,这次应该是迭代器Iterator的内容了,然而Iterator涉及到一个重要的技巧就是Traits编程技法;它还是值得单独一章来介绍一下的。一 获取Iterator的相应类型(associate type)在使用Iterator时,可能需要知道它的相应类型,也就是Iterator指向的变量的类型,在C/C++语言中,如果要获取一个变量的大小可以使用size转载 2012-11-15 18:08:12 · 429 阅读 · 0 评论 -
详细解说STL string
0 前言: string 的角色C++ 语言是个十分优秀的语言,但优秀并不表示完美。还是有许多人不愿意使用C或者C++,为什么?原因众多,其中之一就是C/C++的文本处理功能太麻烦,用起来很不方便。以前没有接触过其他语言时,每当别人这么说,我总是不屑一顾,认为他们根本就没有领会C++的精华,或者不太懂C++,现在我接触perl, php, 和Shell脚本以后,开始理解了以前为什么有人说C转载 2012-11-09 16:40:08 · 1055 阅读 · 0 评论 -
STL 中 sort 函数用法简介
做 ACM 题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的 O(n^2) 排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。 STL 里面有个 sort 函数,可以直接对数组排序,复杂度为 n*log2(n) 。使用这个函数,需要包含头文件#include 。这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址原创 2012-11-06 14:42:11 · 409 阅读 · 0 评论 -
简单的程序诠释C++ STL算法系列之十:search
C++STL的非变易算法(Non-mutating algorithms)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。 search算法函数在一个序列中搜索与另一序列匹配的子序列。它有如下两个原型,在迭代器区间[first1, last1)上找迭代器区间[first2, last2)完全匹配(或者满足二元谓词binary原创 2012-11-06 14:42:02 · 471 阅读 · 0 评论 -
STL容器学习总结
本文主要讨论C++标准库中的顺序容器及相应的容器适配器,这些内容主要涉及顺序容器类型:vector、list、deque,顺序容器适配器类型:stack、queue、priority_queue。 标准库中的容器分为顺序容器和关联容器。顺序容器(sequential container)内的元素按其位置存储和访问,顾名思义,这些内部元素是顺序存放的;顺序容器内的元素排列次序与元素值无转载 2012-10-26 17:35:03 · 339 阅读 · 0 评论 -
STL容器
容器(container)是装有其他对象的对象。容器里面的对象必须是同一类型,该类型必须是可拷贝构造和可赋值的,包括内置的基本数据类型和带有公用拷贝构造函数和赋值操作符的类。典型的容器有队列、链表和向量等。在标准C++中,容器一般用模版类来表示。不过STL不是面向对象的技术,不强调类的层次结构,而是以效率和实用作为追求的目标。所以在STL并没有一个通用的容器类,各种具体的容器也没有统一的基类。转载 2012-10-31 09:55:37 · 519 阅读 · 0 评论 -
泛型编程与STL
泛型编程(generic programming通用编程/类属编程)和面向过程以及面向对象一起,是混合型程序设计语言C++所包含的三种编程风范(paradigm范例/范型)。传统C++的泛型编程,仅仅局限于简单的模版技术。标准C++新引入了容器(container)、迭代器(iterator)、分配器(allocator)和STL(Standard Template Library标准模板转载 2012-10-31 09:56:35 · 670 阅读 · 0 评论 -
STL之Map容器
映射容器map是一种关联容器,表示的是对偶(键,值)的序列。它支持唯一Key类型的键值,并提供对另一个基于键的类型T的快速检索。map还提供双向迭代器。映射容器map在标准C++中,对应于map类,被定义在头文件中。映射:键→值,值 =映射[键](似f:x→ y,y = f(x))。即,可以通过映射,由键来快速定位值。namespace std { // 取自C++2003标准转载 2012-11-01 11:10:49 · 458 阅读 · 0 评论 -
C++ STL中用vector 改进内存的再分配
这里描述的是一种很常见的情况:当你在某个缓存中存储数据时,常常需要在运行时调整该缓存的大小,以便能容纳更多的数据。传统的内存再分配技术非常繁琐,而且容易出错:在 C 语言中,一般都是每次在需要扩充缓存的时候调用 realloc()。在 C++ 中情况更糟,你甚至无法在函数中为 new 操作分配的数组重新申请内存。你不仅要自己做分配处理,而且还必须把原来缓存中的数据拷贝到新的目的缓存,然后释放先前数转载 2012-11-01 11:24:39 · 585 阅读 · 0 评论 -
transform函数的应用
transform函数的作用是:将某操作应用于指定范围的每个元素。transform函数有两个重载版本:transform(first,last,result,op);//first是容器的首迭代器,last为容器的末迭代器,result为存放结果的容器,op为要进行操作的一元函数对象或sturct、class。transform(first1,last1,first2,result,转载 2012-11-02 09:45:57 · 5853 阅读 · 0 评论 -
C++容器:容器操作
1.容器位置操作:c.begin() 返回一个迭代器,它指向容器 c 的第一个元素c.end() 返回一个迭代器,它指向容器 c 的结束点(最后一个元素之后)c.rbegin() 返回一个逆序迭代器,它指向容器 c 的最后一个元素c.rend() 返回一个逆序迭代器,它指向容器 c 的第一个元素前面的位置 2.顺序容器添加元素操作:注意:容器元素原创 2012-10-28 16:13:24 · 474 阅读 · 0 评论 -
详细解说 STL 排序(Sort)
0 前言: STL,为什么你必须掌握 对于程序员来说,数据结构是必修的一门课。从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来。幸运的是这些理论 都已经比较成熟,算法也基本固定下来,不需要你再去花费心思去考虑其算法原理,也不用再去验证其准确性。不过,等你开始应用计算机语言来工作的时候,你会 发现,面对不同的需求你需要一次又一次去用代码重复实现这些已经成转载 2012-10-31 09:57:34 · 327 阅读 · 0 评论 -
STL算法分类
按是否修改容器中的内容和排序及相关操作,给标准库中的算法函数进行分类:非修改性序列操作(12个)循环for_each()对序列中的每个元素执行某操作查找find()在序列中找出某个值的第一次出现的位置find_if()在序列中找出符合某谓词的第一个元素转载 2012-11-01 11:12:15 · 447 阅读 · 0 评论 -
学习STL map, STL set之数据结构基础
STL map和set的使用虽不复杂,但也有一些不易理解的地方,如:为何map和set的插入删除效率比用其他序列容器高?为何每次insert之后,以前保存的iterator不会失效?为何map和set不能像vector一样有个reserve函数来预分配数据?当数据元素增多时(10000到20000个比较),map和set的插入和搜索速度变化如何?或许有得人能回答出来大概转载 2012-11-01 11:26:23 · 402 阅读 · 0 评论 -
c++ STL 轻松入门基础
作 为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的。STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花 一现。本教程旨在传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,到也是件让人愉快的事情。1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL "什么是STL?",假如你对STL还知之甚少,那么我想转载 2012-11-01 11:30:26 · 1054 阅读 · 0 评论