自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

鱼思故渊的专栏

不积跬步,无以至千里;不积小流,无以成江海

  • 博客(33)
  • 资源 (3)
  • 收藏
  • 关注

原创 STL源码学习--vector使用方法总结

一、容器vector使用vector必须包含头文件:#include型别vector是一个定义于namespace std内的template:[cpp] view plaincopyprint?templateclass _Ty,      class _Ax = allocator >  第二个参数定义内存模型。我们一般采用默认的内存模型。

2014-08-31 09:50:48 1154

转载 海量数据中寻找中位数

题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。

2014-08-29 21:47:39 2757

转载 一个数据包的互联网漫游记

尽管大多数最终用户都不关心 Internet 是如何工作的,但是我相信你们当中的仍然会有一些人对 Internet 运转的基本原理非常感兴趣。  在这篇文章中,我们会通过阐释一个数据包从源到目的地的征程,来试着拨开互联网的第一层神秘面纱。由此出发,我们会尽量让本文的内容保持简单基础。  在更进一步之前,让我们先快速简要地理解一下 DHCP 和 DNS 的概念。  DHCP  你有没

2014-08-29 10:01:22 811

转载 当你在地址栏输入一个URL地址回车后,将会发生什么事情

原文:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/  作为一个软件开发者,你一定会对网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器,HTTP,HTML,网络服务器,需求处理等等。本文将更深入的研究当你输入一个网址的时候,后台到底发生了一件件什么

2014-08-29 09:56:52 1383

原创 STL源码分析--迭代器总结、迭代器失效总结

Vector1、内部数据结构:连续存储,例如数组。2、随机访问每个元素,所需要的时间为常量。3、在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化。4、可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存。5、迭代器失效插入:vector的迭代器在内存重新分配时将失效(它所指向的元素在该

2014-08-27 22:12:22 1101

原创 STL源码分析--deque

一、deque的中控器      deque是连续空间(至少逻辑上看来如此),连续线性空间总令我们联想到array或vector。array无法成长,vector虽可成长,却只能向尾端成长,而且其所谓的成长原是个假象,事实上是(1)另觅更大空间;(2)将原数据复制过去;(3)释放原空间三部曲。如果不是vector每次配置新空间时都有留下一些余裕,其成长假象所带来的代价将是相当高昂。    

2014-08-27 21:59:25 1084

原创 STL源码分析--list

相较于vector的连续线性空间,list就显得复杂许多,它的好处是每次插入或删除一个元素,就配置或释放一个元素空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素移除,list永远是常数时间。      list不仅是一个双向链表,而且还是一个环状双向链表。另外,还有一个重要性质,插入操作和接合操作都不会造成原有的list迭代器失效,这在vecto

2014-08-27 20:16:09 1235 3

转载 STL源码分析--list中的sort算法

STL中有一个std::sort算法,但它是不支持std::list的,因为list不提供RandomIterator的支持,但list自己提供了sort算法,把list的元素按从小到大的方式来排序,代码长度到不长,但真是难以读懂,后来扣持了一下午终于搞明白了,贴个总结上来。list::sort的代码如下(sgi stl):[cpp] view plai

2014-08-27 19:58:38 1287

原创 STL源码分析--萃取编程(traits)技术的实现

1.为什么要出现?按照默认认定,一个模板给出了一个单一的定义,可以用于用户可以想到的任何模板参数!但是对于写模板的人而言,这种方式并不灵活,特别是遇到模板参数为指针时,若想实现与类型的参量不一样的实例化,就变得不太可能了!也有时,想禁止此种相同的实例化变得不太可能!故而出现了,Partial Specialization!同时,在使用void*指针时,可以最大限度的共享代码,减少代码的膨胀

2014-08-27 10:25:20 3655 2

原创 STL源码分析--第二级空间配置器

本文讲解SGI STL空间配置器的第二级配置器。相比第一级配置器,第二级配置器多了一些机制,避免小额区块造成内存的碎片。不仅仅是碎片的问题,配置时的额外负担也是一个大问题。因为区块越小,额外负担所占的比例就越大。额外负担是指动态分配内存块的时候,位于其头部的额外信息,包括记录内存块大小的信息以及内存保护区(判断是否越界)。要想了解详细信息,请参考MSVC或者其他malloc实现。

2014-08-26 09:54:52 1622

原创 STL源码分析--空间配置器 第一级配置器

一、SGI STL配置器简介SGI STL的配置器与众不同,它与标准规范不同。如果要在程序中明确使用SGI配置器,那么应该这样写:[cpp] view plaincopyprint?vectorint,std::alloc> iv;  他的名字是alloc,而且不接受任何参数。标准配置器的名字是allocator,而且可以接受参数。SGI S

2014-08-26 09:53:44 951

原创 构造、解构、拷贝语意学

如果一个class已经有了bitwise copy语意,所以implict copy assignment operator被视为毫无用处,也根本不会被合成出来,这一点和copy constructor一样的一个 class对于默认的copy assignment operator,在以下情况下不会表现出bitwise copy语意1、当class内带一个member object,而其c

2014-08-25 11:07:29 939

原创 Data 语意学---Data member的存取效率

《深度探索C++对象模型》对于data member来说,有两种情况static data member数据         每一个static data member只有一个实体,存放在程序的data segment之中,无论以何种方式,无论类的继承关系如何复杂,存取路径都是非常直接Nonstatic data members        直接存放在一个class obje

2014-08-24 11:33:55 913

原创 深度探索C++对象模型-语意学

有三种情况,会以一个object的内容作为另一个class object的初值:           Cpp代码  class X { ... };  X x;    X xx = x;               // 情况1,赋值对象    extern void foo( X x);    void bar()  {           X xx;

2014-08-24 10:24:45 969

原创 编译器合成复制构造函数

定义:      只有单个形参,该形参是对本类类型对象的引用(常用const修饰),这样的构造函数成为复制构造函数。使用方式:(1)显示使用----用一个同类型的对象初始化该对象时;(2)隐式使用----将该类型的对象传递给函数或从函数返回该类型对象时。三种类型的复制构造函数:*bitwise copy constructor :逐位复制-----默认方式*合成的 co

2014-08-24 09:21:22 1403

原创 C++构造函数语意学--编译器在哪些情况合成default constructot

C++新手常有的误解:C++新手一般有两个常见的误解:1.任何class如果没有定义default constructor,就会被合成出一个来。2.编译器合成出来的default constructor会显示设定“class 内每一个data member的默认值”       有四种情况,会导致“编译器必须为未声明的constructor之classes合成一个defaultco

2014-08-23 16:04:45 1437

原创 C++类的内存分布--虚函数表的内存分布

使用Visual Studio工具来看是类的内存分布  先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如果写上/d1 reportSingleClassLayoutXXX(XXX为类名),则只会打出指定类XXX的内存布局。近期的VS版本都支持这样配置。下面可以定义一个类,像下面这

2014-08-22 22:49:05 3664

原创 C++运算符优先级

PrecedenceOperatorDescriptionExampleAssociativity1()[]->.::++--Grouping operatorArray accessMember access from a pointerMember access from an objectScoping operat

2014-08-22 17:42:21 1139

转载 C++在单继承、多继承、虚继承时,复制构造函数。赋值构造函数、析构函数的执行顺序

一、本文目的与说明    1. 本文目的:理清在各种继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容。    2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地方,但是也具有一定的特殊性,所以在总结它的性质时将它单独列出来了。    3. 单继承、多继承、虚继承,既然都属于继承,那么虽然有一定的区别,但还是相同点比较多。如果放在一块讲,但为了将内容制作成

2014-08-16 22:12:10 1459

原创 C++新特性 右值引用 移动构造函数

1、右值引用引入的背景临时对象的产生和拷贝所带来的效率折损,一直是C++所为人诟病的问题。但是C++标准允许编译器对于临时对象的产生具有完全的自由度,从而发展出了Copy Elision、RVO(包括NRVO)等编译器优化技术,它们可以防止某些情况下临时对象产生和拷贝。下面简单地介绍一下Copy Elision、RVO,对此不感兴趣的可以直接跳过:(1) Copy Elision Co

2014-08-16 20:49:25 2778

原创 linux系统管理--htop命令的使用

top作为日常管理工作中最常用也是最重要的Linux系统监控工具之一,可以动态观察系统进程状况。但其缺点就是只支持键盘操作,显示也单调。作为刚才Windows转到Linux的我来说,现在有了一个更好的选择:htop。htop介绍htop是Linux系统下一个基本文本模式的、交互式的进程查看器,主要用于控制台或shell中,可以替代top,或者说是top的高级版。htop命令优点:

2014-08-14 11:14:27 1755

原创 为什么通过空指针(NULL)可以正确调用类的部分成员函数

#include using namespace std;class B {public: void foo() { cout << "B foo " << endl; } void pp() { cout << "B pp" << endl; } void FunctionB() { cout << "funB" << endl; }};int main(

2014-08-14 10:51:17 1688

原创 C++中const的使用方法

------------- const指针、const引用、const引用形参 --------------------【1】const修饰指针和引用1. 术语“const引用”就是“指向const对象的引用”,习惯说成const引用与非const引用。这点与指针不同,指针中“const指针”与“指向const对象的指针”是不同的。2. 值得注意的是:const引用和指向const对象

2014-08-13 09:40:19 1197

原创 C++中stringstream ostringstream istringstream使用方式

C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。  istringstream类用于执行C++风格的串流的输入操作。 ostringstream类用于执行C风格的串流的输出操作。 strstream类同时可以支持C风格的串流的输入输出操作。   istringstre

2014-08-12 21:41:48 2051

原创 前置后置自增自减操作

class Int{ friend ostream& operator<<(ostream& os, const Int& i); friend istream& operator>>(istream& is, Int& i); friend bool operator<(const Int& a, const Int& b);private: int value;public:

2014-08-12 21:17:12 1145

原创 STL中基本的算法(一)

一。replace()       替换算法将指定元素值替换为新值,使用原型如下,将迭代器[first,last)中值为old_value的元素全部替换为new_value值。函数原型:template class ForwardIterator, class T >    void replace ( ForwardIterator first, ForwardIterato

2014-08-10 16:40:50 860

原创 STL源码分析--向量(vector)的实现

vector容器概述      vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,

2014-08-10 15:17:18 774

原创 C++中的左值右值

对于 C++ 中的左值和右值,我们通常的说法是:当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置),这句话来自于 《C++ Primer 第五版》 第 121 页,那么,对于这句话,该作何理解呢?下面我想来谈谈我的看法:ISO C++03规定表达式必须是左值或右值之一,而在ISO C++11中,左值性被正式地扩充为更复杂的值类

2014-08-09 15:05:35 977

原创 C++中顶层const和底层const

1. 顶层 const 与底层 const 概念 指针本身是一个对象,因为,指针实际对应着内存单元的一段存储空间,然而,指针所指向的也是一个数据对象,因此,指针是一个常量与指针所指向的是一个常量是两个完全不同的概念, 顶层 const 表示的是 指针本身是一个常量, 底层 const 表示的是 指针所指的对象是一个常量,更一般情况下, 顶层 const 可以表示任意对象是一个常

2014-08-09 11:10:46 5496 1

原创 构造函数为什么不能为虚函数 & 基类的析构函数为什么要为虚函数

一、构造函数为什么不能为虚函数1. 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函

2014-08-09 09:37:26 1371

原创 C++继承中析构函数 构造函数的调用顺序以及虚析构函数

首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数,只有这样子类才能在构造函数里使用基类的成员,所以是创建子类时先调用基类的构造函数然后再调用自己的构造函数。通俗点说,你要用某些物品,但这些物品你没办法自己生产,自然就要等别人生产出来,你才能拿来用。

2014-08-09 09:33:06 1887

原创 C++静态成员函数和静态数据成员

当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关。静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关。   静态数据成员的用途之一是统计有多少个对象实际存在。   静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝

2014-08-05 22:47:10 2254 1

原创 静态成员函数不能用const修饰 ,也不能存取nonstatic数据

C++中静态成员函数不能用static修饰的原因:static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量。   不能用const的原因:一个静态成员函数访问的值是其参数、静态数据成员和全局变量,而这些数据都不是对象状态的一部分。而对成员函数中使用关键字const是表明:函数不会修改该函数访

2014-08-04 14:44:10 2194

nginx源码分析--带注释

nginx源码分析,分析过程中将重要的部分进行了注释,以便理解

2014-11-26

libevent-1.4.12-stable-注释版

注释了libevent中很关键的部分,很重要的接口函数。

2014-03-07

3G模块驱动运用开发总结

在特定ARM开发板上使用linux 进行3G拨号的连接

2012-11-16

空空如也

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

TA关注的人

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