今天第一次接触学习boost库,虽然以前也听过boost,但是没有用心学习和使用此库. 学习的材料是:Boost_c++库.pdf RAII 智能指针的原理基于一个常见的习语叫做RAII:资源申请即初始化.智能指针只是这个习语的其中一例--当然是相当重要的一例.智能指针的内存都能得到正确的释放,从而将开发人员从这项任务中解放出来.这宝库程序因为异常而中断,原本来用于释放内存的代码被跳过的场景. 用一个动态分配的地址来初始化智能指针,在析构的时候释放内存,就确保了这一点.因为析构函数总是会被执行的…
统计难题 Time Limit:2000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u Submit Status Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).    Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ign…
#转 对C语言输入输出流和缓冲区的深入理解C语言缓冲区(缓存)详解缓冲区又称为缓存,它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区.缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区. 为什么要引入缓冲区比如我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的…
对象管理资源 createInvestment 函数作用时创建一个invest对象: void f() { Investment *pInv = createInvestment(); // call factory function ... // use pInv delete pInv; // release object } 既然f函数中创建对象,销毁对象的责任也应该由它来承担,但是如果“……”区域出现异常或return提前执行,delete将被跳过,从而造成严重的内存泄露,为了确保无论发…
数组 数组的特点: 只能存放一种类型的数据,比如int类型的数组.float类型的数组 里面存放的数据称为“元素” 初始化方式 ] = {, , }; ] = {,}; , , }; ] = {[]=,[] = }; 常见错误 int a[]; ] a; int a[b]; a = {, }; a[] = {,,,}; 内存分析 数组存储空间的大小 存储空间的划分(内存的分配是从高地址到低地址进行的,但一个数组内部元素又是从低到高进行的) 数组名的作用,查看元素地址 数组越界的注意 二维数组 二…
创建对象有以下四种形式: #include <iostream> using namespace std; class A{ private: int i; public: A(){ cout<<"调用没有参数的构造函数"<<endl; } A(int a):i(a){ cout<<"调用有一个参数的构造函数"<<endl; } ~A(){cout<<"成员变量为:"<…
要解释"驱动对象",就得先从 DriverEntry() 说起: 做过C语言开发的都知道程序是从 main() 函数开始执行.在进行 Windows 驱动程序开发的时候没有 main() 函数作为函数入口,取而代之的是 DriverEntry(). DriverEntry() 的原型如下: extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegi…
如果函数接口有指针参数,既可以把指针所指向的数据传给函数使用(称为传入参数),也可以由函数填充指针所指的内存空间,传回给调用者使用(称为传出参数),例如strcpy的函数原型为 char *strcpy(char *dest, const char *src); 其中src参数是传入参数,dest参数是传出参数.有些函数的指针参数同时担当了这两种角色,如select函数.其函数原型为: int select(int nfds, fd_set *readfds,fd_set *writefds,…
四维数组,可用于航天卫星,三维+时间 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> main() { ][][][]; int i, j, k, l; ; int *p; ; printf("%d\n", sizeof(a)); printf("%d\n", sizeof(a) / sizeof(int)); ][][][];p < &a…
跳表的原理就是利用随机性建立索引,加速搜索,并且简化代码实现难度.具体的跳表原理不再赘述,主要是看了levelDB有一些实现细节的东西,凸显自己写的实现不足之处. 去除冗余的key template<typename Key, class Comparator> struct SkipList<Key,Comparator>::Node { explicit Node(const Key& k) : key(k) { } Key const key; // Accessor…
问题聚焦:     使用了资源管理对象(如智能指针),就一定是安全的吗?显然不是.     资源泄露发生可能在于,在“资源被创建”和“资源被转换为资源管理对象”两个时间点之间有可能发生异常干扰. 看下面这个例子: //函数说明 int priority(); //揭示处理程序的优先权 void processWidget(std::tr1::shared_ptr<Widget> pw, int priority); // 用来在某动态分配所得的Widget上进行某些带有优先权的处理 // 这里…
1. 可能会出现资源泄漏的一种用法 假设我们有一个获取进程优先权的函数,还有一个在动态分类的Widget对象上根据进程优先权进行一些操作的函数: int priority(); void processWidget(std::tr1::shared_ptr<Widget> pw, int priority); 注意这里使用了对象管理资源的用法(Item 13),processWidget为它需要处理的动态分配对象Widget使用了智能指针(tr1::shared_ptr). 现在考虑对proc…
AnsiString类是BCB中最常见类之一,了解它对以后深入学习BCB大有帮助. 介绍AnsiString类之前,先要介绍一些背景知识.VCL(Visual Component Library 可视化组件库)大量利用Pascal长字串数据类型,几乎所有基于文本的VCL属性都采用Pascal长字串.例如,Text.Name和Caption属性都是Pascal长字串属性.VCL的许多构件方法和事件处理函数也采用Pascal长字串.由于VCL大量使用Pascal长字串,而C++ Builder使用P…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 让我们先从std::make_unique和std::make_shared的对比开始吧.std::make_shared是C++11的部分,但是,不幸的是,std::make_unique不是.它是在C++14中才被加入到标准库的.如果你使用的是C++11,不要怕,因为一个std::make_unique的基础版本很容易写.看这里: template<typen…
C++没有类似Java.C#等语言的垃圾回收机制,内存管理是最为头痛的工作. new.delete以及指针的不恰当运用是C++中造成资源获取/释放问题的根源. 智能指针是解决这些问题的一种方案,boost.smart_ptr库提供了六种智能指针,包括: scoped_ptr. scoped_array . shared_ptr . shared_array . weak_ptr . intrusive_ptr 它们都是轻量级对象,速度与原始指针相差无几,都是异常安全的. 要使用smart_ptr…
C语言程序的构成 与C++.Java相比,C语言其实很简单,但却非常重要.因为它是C++.Java的基础.不把C语言基础打扎实,很难成为程序员高手. 一.C语言的结构 先通过一个简单的例子,把C语言的基础打牢. /* clang01_1.c */ #include <stdio.h> int main(void) { printf("这是劝学网的C语言教程.\n"); return 0; } C语言的结构要掌握以下几点: C语言的注释是/* ··· */,而不是//···,…
source code https://github.com/haotang923/interview/blob/master/interview%20summary%20of%20C%20and%20CPP/ 学习笔记之IKM C++ 11 - 浩然119 - 博客园 https://www.cnblogs.com/pegasus923/p/8465745.html 学习笔记之100 TOP Ikm C++ Online Test Questions - 浩然119 - 博客园 https:/…
C/C++开发工程师面试题目(一)(附答案分析) 推荐:自己根据在面试中碰到做过的一些题目以及总结的题目,希望对面试的同学有所帮助. 一. 选择题 1. 下列类中(  )不是输入输出流类iostream的派生类. A. fstream      B. ofstream     C. strstream    D. ostrstream 答案:BD 解析:ofstream和ostrstream派生自ostream,而不是iostream.                              …
接前: 之前记录的笔记,终于想起来上传完整. 第7章: 类 定义抽象数据类型 任何对成员对象的访问都可以解释为使用this来访问,即this->member. =default :默认构造函数.如果定义在类内部,则默认是内联的. struct和class 使用struct和class定义类,唯一的区别在于默认的访问范围,struct是public而class是private 友元函数 类的特性 定义类型成员 在类中使用格式: public: typedef std::string::size_t…
//new delete操作符 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; /* 1.new delete 操作符号 都是 c++的关键字 类似于 C语言中的 malloc()函数 free()函数 2.定义对象时,使用了new关键字,会为这个对象在堆上分配内存,不使用new 关键字会直接在栈上分配内存 new 关键字可以分配基础类型内存,数组类型内存,对象类型内存 对于基础类型内存和数组类型内…
对象动态建立和释放 new 和delete 在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来分配和撤销内存空间的.C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数.  new和delete是运算符,不是函数,因此执行效率高.    虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符. new…
(1)指针与二维数组 一个数组的名字代表该数组的的首地址,是地址常量(作为形式参数的数组名除外),这一规定对二维数组或更高维数组同样适用. 在c语言中定义的任何一个二维数组实际上都可以看做是一个一维数组,该一维数组中的每一个成员又是一个一维数组. 若有定义int d[3][4],i,j;且0<=i<=2,0<=j<=3; 1.数组元素d[i][j]的表示方法为: d[i][j] *(d[i]+j) *(*(d+i)+j) (*(d+i))[j] *(&d[0][0]+4*i…
摘要: 1. 面向对象程序设计的核心思想是数据抽象.继承和动态绑定.数据抽象将类的接口和实现分离:继承定义相似的类型并对齐相似关系建模:动态绑定,在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象. 2. 派生类列表中每个基类前面可以有访问说明符:派生类必须在其内部对所有重新定义的虚函数进行声明:派生类可以在这样的函数前加上virtual关键字,但不是必须,因为在C++11中,允许派生类通过在函数形参列表之后增加overside关键字,以此来显式注明它将使用该成员函数改写基类的虚函数.…
C++的函数和对象 1.1 1 混合型语言 c++以.cpp为文件扩展名,有且只有一个名为main的主函数,因保留了这个面向过程的主函数,所以被称为混合语言 2 注释方式 . C++的注释方式有两种,一下所列第一种常用于单行使用,第二种可灵活运用于单行和多行. 1  从 "//" 开始到本行结束, 如// ........... 2 从 “/*”  开始,到 “*/"结束,如 /* Hello,World! */ 3  输入输出对象 1 提取操作: 用提取操作符 “>&…
在C中实现string字符串,使用typedef将string定义为char *. #include <stdio.h> #include <stdlib.h> #include <string.h> typedef char* string; string get_string(string); int main(void) { string name = get_string("What's your name?\n"); printf(&quo…
简介 三五法则规定了什么时候需要  1 拷贝构造函数   2 拷贝赋值函数  3 析构函数 1. 需要析构函数的类也需要拷贝构造函数和拷贝赋值函数. 通常,若一个类需要析构函数,则代表其合成的析构函数不足以释放类所拥有的资源,其中最典型的就是指针成员(析构时需要手动去释放指针指向的内存). 所以,若存在自定义(且正确)的析构函数,但使用合成的拷贝构造函数,那么拷贝过去的也只是指针,此时两个对象的指针变量同时指向同一块内存,指向同一块内存的后果很有可能是在两个对象中的析构函数中先后被释放两次.所以…
C语言本质 计算机中数的表示 浮点数:符号位+指数部分(2的多少次方)+尾数部分(小数点后的数字) 用偏移的指数(Biased Exponent)表示负指数 正规化(Normalize):尾数部分最高位必须是1,故不保存1,节省一位提高精度 浮点数标准:IEEE 754 数据类型详解 计算机存储的最小单位是字节(Byte),一字节等于8个bit char型占一个字节空间,取值范围0~255(无符号整数),-128~-127(有符号整数) x86平台的gcc规定char是有符号的(C优先考虑效率而…
时间:2015-5-13 18:01 在131题之后是按考点分类的题集,有需要的朋友可以看一下 -------------------------------------------------------- 单项选择题:1.程序流程图中带有箭头的线段表示的是( ). A)  图元关系 B)  数据流 C)  控制流   D)  调用关系     参考答案:C [解析]在数据流图中,用标有名字的箭头表示数据流.在程序流程图中,用标有名字的箭头表示控制流.所以选择C).程序流程图:1.箭头表示控制…
#深入理解指针变量 举个错误栗子: //以下代码的目的是输出100和1000,但输出结果只有一个100 #include<stdio.h> #include<malloc.h> int *zhizhen; void junhe(int *p) { *zhizhen=1000;//原因出现在这 p=zhizhen; } int main() { int *p; p=(int *)malloc(100); *p=100; printf("%d\n",*p); fre…
动态分配 在你的问题里.你用了两种方式创建对象.这两种方式基本的不同在于对象的存储时间. 当运行Object myObject;这句代码时.它作为自己主动变量被创建,这意味着当对象出了作用域时也会自己主动销毁.而当你使用new Object()这样的方式时,对象所拥有的内存是动态分配的.这表示直到你调用delete()方法对象才会被销毁.否则一直存在.当须要用动态分配内存来处理时,你应该仅仅使用动态分配的方式,也就是说,当你能够使用动态分配内存的时候就不要使用自己主动变量. 下面是可能会使用到动…