自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

灯火阑珊处

相爱没有那么容易,每个人有ta的脾气

  • 博客(36)
  • 问答 (1)
  • 收藏
  • 关注

转载 关于fork 的一个小问题

首先看一个程序:题目:请问下面的程序一共输出多少个“-”?#include #include #include int main(void){ int i; for(i=0; i<2; i++){ fork(); printf("-"); } wait(NULL); wait(NULL); return 0;

2015-03-31 19:57:52 814

原创 Nginx 的基本数据类型

本节介绍了 Nginx 对基本数据的一种封装,包括基本整型数据类型、字符串数据类型、缓冲区类型以及 chain 数据类型。1、基本数据类型整型数据/* 基本数据结构 */ /* Nginx 简单数据类型 */ /* 在文件 src/core/ngx_config.h 定义了基本的数据映射 */ typedef intptr_t ngx_

2015-03-27 21:39:54 1349

转载 C语言 - 结构体所占字节数

在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。      内存对齐的原因:      1)某些平台只能在特定的地

2015-03-23 13:58:46 17144 3

原创 STL源码剖析 - 第6章 算法 - 6.7.10 - 6.7.11 equal_range 和 inplace_merge

6.7.10、 equal_range(应用于有序区间)      查找区间与value相等的相邻重复元素的起始位置和结束位置 ,返回pair,前一个迭代器是lower_bound作用的返回值,后一个迭代器是uper_bound作用的返回值。lower_bound和uper_bound参考:http://blog.csdn.net/u012243115/article/details/4441

2015-03-20 14:40:56 485

原创 STL源码剖析 - 第6章 算法 - 6.7.9 sort(排序算法)

6.7.9 sort      STL的所有关系型容器(set,map,multiset……)都拥有自动排序功能(底层结构采用RB-tree),不需要sort算法。序列式容器stack、queue和priority-queue不允许排序。剩下的vector、deque和list,前两个适合使用sort排序,list迭代器不属于随机存取迭代器,不适合使用sort排序。      STL的so

2015-03-19 16:36:42 677

原创 STL源码剖析 - 第6章 算法 - 6.7.8 部分元素排序算法

6.7.8  partial_sort, partial_sort_copy重新安排序列[first,last),使序列前半部分middle-first个最小元素以递增顺序排序,并将其置于[first,middle),相对于sort排序算法,只排序middle-first个元素,使用堆效率更高 ,其余last-middle个元素不指定任何排序,并将其置于[middle,last)  。注意

2015-03-19 16:24:52 458

原创 STL源码剖析 - 第6章 算法 - 6.7.5 - 6.7.6 排列组合算法

6.7.5、next_permutation获取[first,last)区间所标示序列的下一个排列组合,若果没有下一个排序组合,则返回false;否则返回true;  /* 函数功能:Rearranges the elements in the range [first,last) into the next lexicographically greater permutation.

2015-03-18 16:46:21 397

原创 STL源码剖析 - 第6章 算法 - 6.7.2 - 6.7.4 二分算法

6.7.2 、low_bound(应用于有序区间)//在已排序区间[first,last)查找value值 //若该区间存在与value相等的元素,则返回指向第一个与value相等的迭代器 //若该区间不存在与value相等的元素,则返回指向第一个不小于value值的迭代器 //若该区间的任何元素都比value值小,则返回last // Binary search (low

2015-03-18 16:42:50 544

原创 STL源码剖析 - 第6章 算法 - 6.7.1 数据处理算法 - 三

1、 replace//将区间[first,last)内的所有old_value都以new_value替代. template void replace(_ForwardIter __first, _ForwardIter __last, const _Tp& __old_value, const _Tp& __new_value) { __ST

2015-03-18 16:04:16 469

原创 STL源码剖析 - 第6章 算法 - 6.7.1 数据处理算法 - 二

1、  for_each将仿函数f施行于区间内的每一个元素上,但f不能改变元素的内容// for_each. Apply a function to every element of a range. //功能:Applies function fn to each of the elements in the range [first,last). //将仿函数f应用于[fir

2015-03-18 14:46:24 509

原创 STL源码剖析 - 第6章 算法 - 6.7.1 数据处理算法 - 一

6.7.1 单纯的数据处理1、adjacent_find//查找区间[first,last)内第一次重复的相邻元素 //若存在返回相邻元素的第一个元素位置 //若不存在返回last位置 /*该函数有两个版本:第一版本是默认操作operator==;第二版本是用户指定的二元操作pred 函数对外接口的原型: equality (1):默认操作是operator==

2015-03-17 17:25:32 477

原创 STL源码剖析 - 第6章 算法(algorithms) - set相关算法

6.5 set相关算法    本节介绍set集合的相关算法,分别是并集set_union,交集set_intersection,差集set_difference,和对称差集set_symmetric_difference,这四个函数都提供了两个版本的函数原型:第一个版本是采用默认的排序比较方式operator接受的输入区间都是有序的(set内的元素默认有序,可接受multiset容器作为输入区

2015-03-17 16:32:40 519

原创 STL源码剖析 - 第6章 算法(algorithms) - 基本算法<stl_algobase.h>

6.4 基本算法    STL标准规格中并没有区分基本算法或复杂算法,然而SGI却把常用的一些算法定义于中,其他算法定义于中。这些常用的算法包含equal,fill,fill_n,iter_swap,lexicographical_compare,max,min,mismatch,swap,copy,copy_backward,copy_n。其中一个比较重要的算法就是copy,针对copy的剖

2015-03-17 15:28:33 579

原创 STL源码剖析 - 第6章 算法(algorithms) - 数值算法<stl_numeric.h>

6.3 数值算法   本节介绍的数值算法是在源码SGI STL中的文件,具体功能详见下面的源码剖析,在源码剖析的时候,针对每个元素都给出了使用例子,这样可以增加对其理解。numeric数值算法源码剖析#ifndef __SGI_STL_INTERNAL_NUMERIC_H#define __SGI_STL_INTERNAL_NUMERIC_H__STL_BEGIN_NAMESPA

2015-03-17 15:02:01 489

原创 STL源码剖析 - 第5章 关联式容器 - hash_multimap

5.11 hash_multimap       hash_multimap和hash_map的区别就像multimap与map的区别一样,hash_multimap的底层机制是基于hashtable,它可以存在重复的键值,所以插入函数使用insert_equal(),hash_multimap和hash_map一样,容器的内容不自动排序。本文源码出自SGI STL的文件。hash_mul

2015-03-13 16:09:54 651

原创 STL源码剖析 - 第5章 关联式容器 - hash_multiset

5.10 hash_multiset       hash_multiset和hash_set的区别就像multiset与set的区别一样,hash_multiset的底层机制是基于hashtable,它可以存在重复的键值,所以插入函数使用insert_equal(),hash_multiset和hash_set一样,容器的内容不自动排序。本文源码出自SGI STL的文件。hash_mul

2015-03-13 16:06:09 451

原创 STL源码剖析 - 第5章 关联式容器 - hash_map

5.9 hash_map   hash_map以hash table为底层机制,和map类似,每一个元素都同时拥有一个实值和一个键值,但是不同点是hash_map容器中的元素是没有排序的,因为hash table没有提供排序功能。本文源码出自SGI STL的文件。        hash_map源码剖析#ifndef __SGI_STL_INTERNAL_HASH_MAP_H#def

2015-03-13 16:05:15 452

原创 STL源码剖析 - 第5章 关联式容器 - hash_set

5.8 hash_set   hash_set以hashtable为底层机制。和set类似,hast_set的键值就是实值,实值就是键值,但是不同点是hash_set容器中的元素是没有排序的,因为hash table没有提供排序功能。hash_set的使用方式与set完全相同。本文源码出自SGISTL的文件。hash_set容器源码剖析#ifndef __SGI_STL_INTERNA

2015-03-13 15:56:37 466

原创 STL源码剖析 - 第5章 关联式容器 - hashtable

5.7 hashtable前面介绍的关联容器set、multiset、map和multimap的底层机制都是基于RB-Tree红黑树,虽然能够实现在插入、删除和搜索操作能够达到对数平均时间,可是要求输入数据有足够的随机性。本文介绍的hashtable不需要要求输入数据具有随机性,在插入、删除和搜索操作都能达到常数平均时间。本文介绍的hash table是来自SGI STL中的文件,在这里为

2015-03-13 15:38:09 468

原创 STL源码剖析 - 第5章 关联式容器 - multimap

5.6 multimap        multimap的特性及其用法和map完全相同,唯一的区别就是multimap允许键值key重复,因此multimap的插入操作采用的是底层RB-Tree的insert_equal()而非insert_unique()。本文的源码出自SGISTL中的文件。#ifndef __SGI_STL_INTERNAL_MULTIMAP_H#define __

2015-03-13 14:08:15 499

原创 STL源码剖析 - 第5章 关联式容器 - multiset

5.5 multiset       multiset的特性及其用法和set完全相同,唯一的区别就是multiset允许键值key重复,因此multiset的插入操作采用的是底层RB-Tree的insert_equal()(可以插入重复的键)而非insert_unique()。本文的源码出自SGI STL中的文件。#ifndef __SGI_STL_INTERNAL_MULTISET_

2015-03-13 14:05:16 457

原创 STL源码剖析 - 第5章 关联式容器 - map

5.4 map     在SGI STL中的容器map,底层实现机制是RB-Tree,是因为map的操作RB-Tree都能实现。在map容器键值key和实值value是不相同的,键值key和实值value的比较函数也是不同的。在map容器里面的元素是根据元素的键值自动排序的,不能修改map容器的键值,但是可以修改容器的实值。map的所有节点元素都是pair。pair有两个成员变量first,s

2015-03-12 16:36:26 566

原创 STL源码剖析 - 第5章 关联式容器 - set

5.3 set      在SGI STL中的容器set,其实现基本上是在RB-Tree的基础上,以RB-Tree作为其底层的实现机制,几乎所有的set操作行为,都只是转调用RB-tree的操作行为而已。在set容器中键值key和实值value是相同的,且在容器里面的元素是根据元素的键值自动排序的,同时我们不能修改set容器里面的元素值,所以set的迭代器是采用RB-Tree的const_it

2015-03-12 16:03:31 515

原创 STL源码剖析 - 第5章 关联式容器 - RB-tree(红黑树)

5.1 树的导览     标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表)。这些容器的底层机制均以RB-tree(红黑树)完成。RB-tree也是一个独立的容器,但并不开放给外界使用。此外,SGI STL还提供了一个不在标准规格之列的关联式容器:hash table(散列表),以及以此hash

2015-03-12 15:37:00 640

原创 STL源码剖析 - 第4章 序列式容器 - ilist

4.9.1 slist概述    在STL标准中提供了双向链表list,本文介绍的是SGISTL中定义的单向链表slist。单向链表的迭代器是属于正向迭代器,所以在单链表进行插入元素时,在指定节点之后插入时时间是常数O(1),在指定节点之前插入时需要线性时间O(n)。相比于双向链表list,它所耗用的空间更小,某些操作更快。slist和list有一个共同的特殊是:它们的插入,移除,拼接等操作不

2015-03-11 15:44:14 421

原创 STL源码剖析 - 第4章 序列式容器 - priority_queue

4.8.1 priority_queue概述        priority_queue(优先队列)是拥有优先级的queue,不过它容器内的元素并不是根据加入顺序排列,而是根据用户定义的优先级进行排列。priority_queue只能在队列尾部加入元素,在头部取出元素。不能遍历容器,因此不需要自己设置迭代器。在SGI STL的源码的class priority_queue设计中,它是基于某种容

2015-03-11 14:57:29 455

原创 STL源码剖析 - 第4章 序列式容器 - heap

4.7.1 heap概述    在STL中,heap并不是一种容器,而是一种算法,作为下一节的priority queue的助手,任何能够提供随机访问迭代器的容器都能支持heap的操作。heap不需要遍历内容,所以没有属于自己的迭代器。本文介绍的heap是基于vector容器的操作;有关堆的定义可以参考:http://blog.csdn.net/u012243115/article/detai

2015-03-11 14:32:08 534

原创 STL源码剖析 - 第4章 序列式容器 - queue

4.6.1 queue概述       queue是一种“先进先出”的数据结构,可以对两端进行操作,但是只能在队列头部进行移除元素,只能在队列尾部新增元素,可以访问队列尾部和头部的元素,但是不能遍历容器,所以queue不需要设计自己的容器。在SGI STL的源码的class queue设计中,它是基于某种容器作为底部结构的,默认容器是deque容器,用户也可以自己指定容器的类型。4.6

2015-03-10 16:33:40 473

原创 STL源码剖析 - 第4章 序列式容器 - stack

4.5.1 stack概述    stack是一种“先进后出”的数据结构,它只能在栈顶对数据进行操作,即只能在栈顶进行新增元素、移除元素、取得最顶端元素。不能进行遍历行为,所以不需要设计自己的迭代器。在SGI STL的源码的设计中,它是基于某种容器作为底部结构的,默认容器是deque容器,用户也可以自己指定容器的类型,比如list或者vector。4.5.2 stack容器配接器

2015-03-10 15:38:43 494

原创 STL源码剖析 - 第4章 序列式容器 - deque

4.4.1 deque概述    deue是一种双向开口的分段连续线性空间,可以在头尾端进行元素的插入和删除。    deque和vector最大的差异就是:第一是deque允许于常数时间内对头端进行插入或删除元素;第二是deque是分段连续线性空间,随时可以增加一段新的空间;deque不像vector那样,vector当内存不够时,需重新分配/复制数据/释放原始空间;不过dequ

2015-03-10 15:10:25 594

原创 STL源码剖析 - 第4章 序列式容器 - list

4.3.1 list概述    在SGI STL中,list容器是一个循环的双向链表,它的内存空间效率较前文介绍的vector容器高。因为vector容器的内存空间是连续存储的,且在分配内存空间时,会分配额外的可用空间;而list容器的内存空间不一定是连续存储,内存之间是采用迭代器或节点指针进行连接,并且在插入或删除数据节点时,就配置或释放一个数据节点,并不会分配额外的内存空间,这两个操作过程

2015-03-08 17:07:25 551

原创 C程序内存相关知识点

c 内存分配1、程序代码区:存放函数体的二进制代码。  2、全局区数据区:全局数据区划分为三个区域。     全局变量和静态变量的存储是放在一块的。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。常量数据存放在另一个区域里。这些数据在程序结束后由系统释放。我们所说的BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量

2015-03-07 21:22:42 453

原创 C语言程序的内存分布

在任何程序设计环境及语言中,内存管理都十分重要。在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的。因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题。1.C程序结构下面列出C语言可执行程序的基本情况(Linux 2.6环境/GCC4.0)。[root@localhost Ctest]# ls test-l     //test为一个可执行程序-rwxr-xr-x 1

2015-03-07 20:43:00 637

原创 STL源码剖析 - 第4章 序列式容器 - vector

4.2 vector容器       在STL编程中,我们最常用到的就是容器,容器可分为序列容器和关联容器;本文记录的是我们经常使用的序列容器之vector,vector的数据安排和操作方式类似于C++内置数组类型array,唯一的区别就是在于空间的灵活运用。内置数组array是静态空间,一旦分配了内存空间就不能改变,而vector容器可以根据用户数据的变化而不断调整内存空间的大小。   

2015-03-07 15:45:24 644

原创 STL源码剖析 - 第3章 迭代器的概念与traits编程技法

在STL编程中,容器和算法是独立设计的,即数据结构和算法是独立设计的,连接容器和算法的桥梁就是迭代器了,迭代器使其独立设计成为可能。Traits编程技术是STL中最重要的编程技术,Traits可以获取一个类型的相关信息。3.4 Traits编程技术       Traits可以获取一个类型的相关信息,首先我们看下面的程序:template void function(T

2015-03-07 13:55:13 525

原创 STL源码剖析 - 第2章 空间配置器

SGI STL源码下载地址    空间配置是为存储数据提供可用的空间,在Standard Template Library(STL)中,空间配置是最底层的东西,为容器提供服务。2.1 空间配置器的标准接口   空间配置器(Allocator)的主要实现文件是alloc.h和stl_alloc.h,标准接口位于文件stl_alloc.h的588-628行;具体如下:/*tih

2015-03-05 20:40:50 592

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除