c++ -- 22




1 2 3
概述数组是 C 语言中最常用的数据类型之一,它使用整块内存,按固定大小分割,所以很容易定位到指定序号的元素,因此,在所有容器中,数组的随机访问速度是最快的但是 C 语言的数组是不能动态扩展的,所以 nginx 对他进行了一个封装,成为了类似于 C++ STL 中 vector 的数据类型具有以下优点:访问速度快元素个数不确定,并可以动态扩充内存池统一管理内存 nginx 动态数组相关的声明和定义分别在:ngx_array.h 和 ngx_array.c 两个文件中 动态数组结构 -- ngx_array_t// struct ngx_array_t // nginx 数组结构 {{{ typedef struct { void *elts; // 数组起始位置 ngx_uint_t nelts; // 数组元素个数 size_t size; // 单个元素大小 ngx_uint_t nalloc; // 空间能够容纳元素个数 ngx_pool_t *pool; // 内存池 } ngx_array_t; // }
#技术帖    #算法    #c++    #cpp   

200x200


简介我们知道,对于一棵高度为h的二叉查找树上的各种基本操作而言,其时间复杂度都是O(h)的,因此,怎样减小树的高度成为了降低时间复杂度的必要手段,因此,我们需要去找寻一种新的数据结构,让构造的二叉查找

#技术帖    #算法    #c++    #cpp   
问题C++ programming language 第309页的例子:template <class C> class Basic_ops //基本操作类 { public: bool operator== (const C&) const; bool operator!= (const C&) const; // ... const C& derived () const //获得操作访问权 { return static_cast <const C&> (*this); } }; template <class T> class Math_container : public Basic_ops < Math_container<T> > //具体实现的容器类 { public: size_t size() const; T& operator[] (size_t); const T& operator[] (size_t) const; // ... }; 这样,使得有关容器的基本操作定义可以与容器本身的定义分开,而且只需定义一次&n
#读书笔记    #技术帖    #c++    #cpp   
问题在C++ programming language一书的第九章中描述了C++的单一定义规则,ODR,根据这一规则,“一个inline函数必须在需要用他的每个编译单位里通过完全一样的定义来定义”并且举了例子:file1.c:inline int f(int i) { return i; } file2.c:inline int f(int i) {return i+1;} 书中说这个例子是非法的,因为在两个编译单位中的定义不完全相同那么,下面是我写的一个代码,也是我的问题:我的程序分为main.cc、func.cc和function.h三个文件,main.cc和func.cc中定义了两个如上面反例所写的同名inline函数,他们的函数体并不相同,function.h中是这个inline函数的声明:/* * file: main.cc * author: 龙泉居士 * date: 2012-10-17 04:37 */ #include <iostream> #include "function.h" using namespace std; int main () { f(3); return 0; } inline void f (int a) { cout <<
#读书笔记    #技术帖    #c++    #cpp   
概述有三种方法可以定位标准IO流ftell 和 fseek 函数,这两个函数假定文件的位置可以存放在一个长整型中ftello 和 fseeko 函数,他们使用off_t类型代替了长整型fgetpos 和 fsetpos 函数,是由ISO C引入,用抽象数据类型fpos_t记录文件位置 ftell、fseek、rewindlong ftell ( FILE *stream ); 返回当前文件位置指示,调用出错返回-1L int fseek(FILE *stream, long offset, int whence); 调用成功返回0,否则返回非0值 用于二进制文件时,必须指定一个字节的offset,以及解释这种偏移量的方式 whence与lseek函数的相同:若whence是SEEK_SET, 则将该文件的偏移量设置为距文件开始处offset个字节若whence是SEEK_CUR,则将该文件的偏移量设置为其当前值加offset,offset可以为正或负若whence是SEEK_END,则将该文件的偏移量设置为文件长度加offset,offset可以为正或负对于文本文件,offset只能取两种值,0(文件起始处)或是f
#读书笔记    #技术帖    #linux    #unix   
标准IO库提供了两个函数进行二进制IO操作,与普通IO操作不同的是,二进制IO往往需要读写整个结构,一次循环处理一个字节,而不是仅仅某个字符,而如果通过调用 fputs 和 fgets 实现,由于二进制IO过程中可能会提供 null 字节而不能正确工作 size_t fread (void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp); size_t fwrite (const void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp); 定义于 <stdio.h> 头文件中,返回读或写的对象数 ptr 指向需读写对象的首地址size 为对象大小nobj 为对象个数fp 为读/写文件指针注:restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式。即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇
#读书笔记    #技术帖    #linux    #unix   
非格式化IO一旦打开了流,则可以在三种不同类型的非格式化IO中进行选择,对其进行读写操作: 每次一个字符的IO 每次一行的IO 一次读或写一行,则使用 fgets 和 fputs,每行以一个换行符终止。 直接IO(二进制IO) fread 和 fwrite 函数支持直接的IO操作,每次IO读或写固定数量的对象,这两个函数常用于从二进制文件中每次读或写一个结构  每次读或写一个字符的IO1、输入函数int getc ( FILE *stream ); int fgetc ( FILE *stream ); int getchar ( void ); 定义于stdio.h头文件中,若成功则返回下一个字符,若已到达文件结尾或出错则返回EOF 区别:getchar等价于getc(stdin)getc可以被系统实现为宏,而fgetc不行,这意味着,fgetc一定是一个函数,而getc可能是一个宏,因此fgetc可以取得函数地址并作为另一个函数的参数,但fgetc的调用时长可能会长于getc 为了判断返回EOF时函数是否出错,必须调用 ferror 或 feof 函数int ferror(FILE *stream); int feof(FILE *stream); 定义于stdio.h头文件中,条件为真
#读书笔记    #linux    #unix    #c++   
打开文件可以使用三个函数中的一个打开流:FILE * fopen(const char * path,const char * mode); FILE *freopen(const char *filename,const char *type, FILE *stream); FILE * fdopen(int fildes,const char * mode); 均声明于stdio.h头文件中,若调用成功则返回文件指针,调用失败返回NULL 三个函数的区别是:fopen打开一个指定的文件freopen在一个指定的流上打开一个指定的文件,若该流已经打开,则先关闭该流。若已经定向,则清除定向。此函数一般用于将指定的文件打开为一个预定的流:标准输入、标准输出或标准失败fdopen获取一个现有的文件描述符,并使一个标准IO流与该描述符相结合。此函数通常用于由创建管道和网络通信函数返回的描述符。因为这些特殊类型的文件不能用fopen函数打开,所以需要先调用设备专用函数以获取一个文件描述符 type参数指定IO流的读写方式,ISO C规定了15种type的值 r 或 rb 为读而打开 w 或 wb 如果文件不存在则创建,若文件存在则先将文件截短至0 a 或 ab 如果文件不存在则创建,若文件存在则定位到文件尾 r+ 或 r+b 或 rb+ 为读写打开文
#读书笔记    #技术帖    #linux    #unix   
标准输出、标准输入和标准出错对一个进程预定义了三个流,并且这三个流可以自动的被进程使用,他们就是标准输入、标准输出和标准出错。通过预定义的文件指针 stdin、stdout和stderr加以引用,这三个文件指针同样定义于stdio.h中 缓冲标准IO库提供缓冲的目的是尽可能减少使用read和write的次数。标准IO提供了三种类型的缓冲:(1)全缓冲这种情况下,只有在填满标准IO缓冲区后才进行IO操作,对于驻留在磁盘上的文件通常是由标准IO库实施全缓冲的,在一个流上执行第一次流操作时,相关标准IO函数调用malloc获得需要使用的缓冲区冲洗(flush)缓冲区可以由标准IO例程自动冲洗(如缓冲区被填满时),也可以调用fflush函数冲洗一个流值得注意的是,对于标准IO,flush以为着将缓冲区中的内容写到磁盘上,而在终端驱动程序方面,flush意味着丢弃已存储在缓冲区中的数据int fflush(FILE *stream) 定义于stdio.h头文件中,调用成功返回0,否则返回EOF,如果stream为NULL,则冲洗所有输出流(2)行缓冲在这种情况下,当在输入或输出中,遇到换行符时才执行IO操作,但如果在遇到换行符前缓冲区已经被填满,则立即执行IO操作(3)不带缓冲标准IO库不对字符进行缓冲存储,所以系统很可能会一个字符一个字符地完成读写标准出错流s
#读书笔记    #技术帖    #linux    #unix   
1 2 3



京ICP备15018585号