栈与队列
栈(Stack):后进先出(LIFO last in first out)。 队列(Queue):先进先出(FIFO first in first out)。 栈(Stack)12345678typedef struct{ int data[MAXSIZE]; int top;}Stack;stack->data[stack->top--]; /* 弹出元素后,top-- */stack->data[++stack->top]; /* top++后,增加一个元素 */ 链式实现 12345678910111213141516typedef struct Node{ int data; struct Node* next;}Node;typedef struct{ Node* top; int size;}Stack;stack->top = node;stack->size++;stack->top = stack->top->next;stack-...
C++多线程编程
功能 POSIX C C++11 启动线程 pthread_t类型和相关API函数,pthread_create(),pthread_detach()和pthread_join() std::thread类与成员函数 互斥 pthread_mutex_t类型相关API函数,pthread_mutex_lock(),pthread_mutex_unlock()等 std::mutex类与成员函数,std::lock_guard<>和std::unique_lock<>模板 监控等待预期 pthread_cond_t类型与相关API函数,pthread_cond_wait(),pthread_cond_timed_wait()等 std::condition_variable和std::condition_cariable_any类与成员函数 原子操作与并发感知内存模型 不可用 std::atomic_xx类型,std::atmoic<>类模板,std::atomic_thread_fence()函数 线程安全容器 不可...
C++ Primer(六) 模板与泛型编程
面向对象编程和泛型编程都能处理在编写程序时不知道类型的情况。OOP能处理类型在程序运行之前都未知的情况;而泛型编程中,在编译时就可以获知类型。 定义模板函数模板模板定义以关键字 template开始,后接模板参数列表(template parameter list),模板参数列表表是用尖括号<>括住的一个或多个模板形参的列表,用逗号分隔,不能为空。使用模板时,我们显式或隐式地指定模板实参,将其绑定到模板参数上。 123456template<typename T>int compare(const T &v1, const T &v2){ if(v1 < v2) return -1; if(v2 < v2) return 1; return 0;} 模板类型参数(type parameter):类型参数前必须使用关键字class或者typename,这两个关键字含义相同,可以互换使用。旧的程序只能使用class。 非类型模板参数(nontype parameter):表示一个值而非...
C++ Primer(五) 面向对象程序设计
继承与派生 继承方式 继承的构造函数 多继承 虚继承 多态与虚函数 虚函数 虚析构函数 纯虚函数与抽象类 RTTI dynamic_cast运算符 typeid运算符 type_info类 OOP:概述面向对象程序设计(object-oriented programming)的核心思想是数据抽象、继承和动态绑定。 继承(inheritance):通过继承联系在一起的类构成一种层次关系。通常在层次关系的根部有一个基类(base class)。其他类直接或者间接从基类继承而来,这些继承得到的类成为派生类(derived class)。基类负责定义在层次关系中所有类共同拥有的成员,而每个派生类定义各自特有的成员。 对于某些函数,基类希望它的派生类个自定义适合自己的版本,此时基类就将这些函数声明成虚函数(virtual function)。 派生类必须通过使用类派生列表(class derivation list)明确指出它是从哪个基类继承而来。形式:一个冒号,后面紧跟以逗号分隔的基类列表,每个基类前都可以有访问说明符。 12345678910class Quote...
C++ Primer(四) 操作符重载
基本概念重载运算符是具有特殊名字的函数:由关键字operator和其后要定义的运算符号共同组成。 当一个重载的运算符是成员函数时,this绑定到左侧运算对象。成员运算符函数的(显示)参数数量比运算对象的数量少一个。 只能重载大多数的运算符,而不能发明新的运算符号。重载运算符的优先级和结合律跟对应的内置运算符保持一致。 123456//非成员运算符函数data1 + data2;operator+(data1, data2);//成员运算符函数data1 += data2;data1.operator+=(data2); 将运算符是否定义为成员函数的一些判断: 赋值(=)、下标([])、调用(())和成员访问箭头(->)运算符必须是成员。 复合赋值运算符一般来说是成员,但并非是必须的。 改变对象状态的运算符或者与给定类型密切相关的运算符通常是成员,如递增、解引用。 具有对称性的运算符可能转换任意一端的运算对象,如算术、相等性、关系和位运算符等,通常是非成员函数。 可以被重载 不可以被重载 +, -, *, /, %, ^ ::, .*, ., ? :, ...
C++ Primer(三) 标准库
IO库 istream:输入流类型,提供输入操作。 ostream:输出流类型,提供输出操作 cin:一个istream对象,从标准输入读取数据。 cout:一个ostream对象,向标准输出写入数据。 cerr:一个ostream对象,向标准错误写入消息。 >>运算符:用来从一个istream对象中读取输入数据。 <<运算符:用来向一个ostream对象中写入输出数据。 getline函数:从一个给定的istream对象中读取一行数据,存入到一个给定的string对象中。 IO类 iostream头文件:从标准流中读写数据,istream, ostream, iostream等。 fstream头文件:从文件中读写数据,ifstream, ofstream, fstream等。 sstream头文件:从字符串中读写数据,istringstream, ostringstream, stringstream等。 IO对象无拷贝或赋值 1.IO对象不能存在容器里. 2.形参和返回类型也不能是流类型。 3.形参和返回类型一般是流的引用。 4.读写一个IO...
C++ Primer(二) 类与对象
类与对象类(class)定义了一种数据类型(成员变量),以及一组与其关联的一组操作(成员函数)。类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量(具体实例,Instance)。 在类体中与类体外定义成员函数的区别为:在类体中定义的成员函数会自动成为内联函数(inline),在类体外定义的不会。 this指针成员函数可以通过名为this的额外隐式参数来访问调用它的对象(实例化的类)。this只能在成员函数内部使用,其它地方非法,且只有当对象被创建后this才有意义,所有也不能在static成员函数中使用。 this关键字实际是成员函数的隐式形参,在编译阶段由编译器添加到参数列表中,在调用成员函数时将对象的地址作为实参传递给this。 this关键字实际上也是一个const指针(常量指针,顶层const),this指针的值(不是this指针所指对象的值)不能被修改(例如:赋值,递增,递减)。 const成员默认情况下this指针是指向非常量的指针常量(可以通过指针改变对象值,但不能改变指针指向),它是不可以指向常量对象,所以const类型的类对象不能调用普...
C++ Primer(一) 基本语法
命名空间::域解析操作符:编译器从操作符左侧名字所示的作用域中寻找右侧那个名字。 using声明形式using namespace::name。头文件中不应包含using声明。 变量与基本类型计算机以比特序列(bit,b)存储数据,每个比特非0即1。 大多数计算机以2的整数次幂个比特作为块来处理内存,可寻址的最小内存块称为字节(byte,Byte,B)。 存储的基本单位称为字(word),它通常由几个字节组成。 123451byte = 8 bit 1KB = 1024B 1MB = 1024KB 1GB = 1024MB1TB = 1024MB 赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。 注意含有无符号类型的表达式: 当一个算术表达式中既有无符号数又有int值时,那个int值就会转换成无符号数。 当从一个无符号数中减去一个值时,不管这个值是不是无符号数,需确保结果不是一个负值。 递减循环中,结果永远不会是负数(>=0)。 变量变量提供一个具名的,可供程序操作的存储空间。数据类型决定变量所占...
链表
链表(linked list)是一种常见的线性数据结构。常见的链表分类有:单向链表,双向链表,循环链表,静态链表等。 链表节点结构链表结构又分为带头结构的链表与不带头结构的链表。 单向链表 12345678910111213struct Node { int data; struct Node *next;}/* 链表头,可带可不带 */struct Header { int length; struct Node *next;};typedef struct Node Node;typedef struct Header pHead; 双向链表 1234567891011121314struct Node;typedef struct Header* pHead;typedef struct Node* pNode;struct Header{ int length; pNode next;};struct Node{ int data; pNode pre; pNode next...
编译器之神-Vim
Keep it simple enough. 常用指令 i插入,在光标前插入 x删除当前光标所在的字符 dd删除并保持剪贴板,2dd删除2行 p黏贴 3p hjkl左下右上 数字0到行头 ^到本行第一个不是blank(空格,tab,换行,回车)字符 $到本行行尾,0到本行开头 g_本行最后一个不是blank字符位置 /pattern 搜索出字符多个匹配,按n到下一个 yy拷贝当前行,相当于ddp u撤销 反撤销 .重复上一次命令 3.重复三次 NG到第N行 :N如:137 gg到第一行 G到最后一行 块操作hjkl =自动缩进<>左右缩进 自动补全 .vimrc无插件基本配置说明1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465""""" 基础无插件设置set nu &quo...
