
c-c++
零下10度C_zjw
关注计算机互联网发展的点点滴滴
展开
-
Linux虚拟地址空间
CPU为什么 要用虚拟地址空间与物理地址空间映射?解决了什么样的问题?1.方便编译器和操作系统安排程序的地址分布。 程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区;2.方便进程之间隔离 不同进程使用的虚拟地址彼此隔离,一个进程中的代码无法更改正在由另一进程使用的物理内存;3.方便OS使用可怜的内存 程序可以使用一些列虚拟地址来访问大于可用物理内存的内存缓冲区,当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为4kb)保存到磁盘文件。数据或...原创 2021-11-20 16:51:14 · 583 阅读 · 0 评论 -
Linux中静态库的制作和使用
Linux中静态库的制作1.命名规则1)lib + 库的名字 + .a;2)libmytest.a2.制作步骤1)生成对应的.o文件 — .c —— > .o -c2)将生成的.o文件打包 ar rcs + 静态库的名字(libmytest.a) + 生成的所有的.o3)发布和使用静态库:发布静态库和头文件即可首先建三个文件夹,分别存放头文件(include)、源文件(src)及生成的静态库文件(lib);head.hadd.cpp...原创 2021-11-17 22:09:36 · 1633 阅读 · 0 评论 -
二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。分析:按照常规思路,我们对数组中的每一个数进行遍历,那么复杂度是比较大的,为O(n2)。显然,这种做法不仅效率低下,而且没有用到题目中给的数组递增的信息。那么怎么运用数组递增的信息呢?可以这样想:假如我们每次选取数组的右上角原创 2017-04-12 12:29:49 · 343 阅读 · 0 评论 -
字符串—空格替换
题目:请实现一个函数,把字符串中的每个空格图化成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。分析:有两种情形。一种是直接在原来的字符串上进行修改,从头到尾依次遍历每一个字符,当遇到空格时,我们就用“%20”去替换该空格,由于字符串长度的增加,每一次的替换,空格后的字符串都要向后移动,该做法的复杂度为O(n2);另一种是创建一个新的字符串,并原创 2017-04-12 15:14:01 · 557 阅读 · 0 评论 -
C++的运算符重载
C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。 运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运转载 2017-04-18 23:24:07 · 244 阅读 · 0 评论 -
字符串转换为数字
问题:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串“345”,则输出整数345。分析:可以一次扫描每一个字符,把之前得到的数字乘以10再加上当前字符表示的数字。需要考虑:1)输入的是否是空字符串; 2)是否有正负号; 3)字符串中是否有非数字的字符,如果有,则停止转换; 4)考虑移除问题;代码如下:int str2num(const原创 2017-05-11 22:15:55 · 524 阅读 · 0 评论 -
使用strcat和strcpy时遇到的问题
在学习strcat函数的过程中,写了一个测试代码,结果编译都没问题,但是运行时发生了中断。下面具体来剖析一下。 看下面一段代码:int main(){ char *err = "ERROR"; char *errMsg = "Not enough money"; char *buffer = (char*)malloc(strlen(err)+str(errMsg)+原创 2016-04-25 20:20:01 · 2817 阅读 · 2 评论 -
C++类型转化详解—const_cast
转自:C++类型转化详解—const_cast一. 函数描述: const_cast(expression) 主要是用来去掉const属性,当然也可以加上const属性。主要是用前者,后者很少用。去掉const属性: const_castclass A{public: int m_iNum; A(){m_iNum = 0;}};void foo(){ //1.指针转载 2016-05-17 11:51:59 · 508 阅读 · 0 评论 -
字符串的移位
给定一个字符串str及其长度len,将其前面n个字符移动到字符串的尾部,将后面的(len-n)个字符串移动到字符串的前面。要求:算法的额外空间复杂度为O(1)。例:str = “ABCEF”,len = 5, n = 3,则移位后的字符串str = “EFABC”。思路:如果对空间复杂度没有要求,则我们可以将字符串看做两部分,然后开辟两块空间来存储,然后将两个子串调换位置即可,但是原创 2017-08-07 16:11:44 · 1922 阅读 · 0 评论 -
字符串拼接最小字典
给定一个字符串数组,找到一种拼接顺序,使得所有小字符串拼接成的大字符串在所有可能的拼接中字典序最小。例如:给定strArr = {"bac", "bd"},n = 2。则有两种拼接顺序bacbd和bdbac,显然第一种拼接的字典序要小于第二种。我们是否可以这样认为:如果str1的字典序小于str2的字典序,那么str1一定就放在前面,也就是str1+str2的字典序一定小于str2原创 2017-08-07 16:40:13 · 940 阅读 · 0 评论 -
最长无重复字符子串
给定一个字符串,求出其最长的无重复的字符子串的长度。例:给定字符串str = “abcdahisjgdb”,则其最长无重复子串为“bcdahisjg”,长度为9。思路:我们遍历字符串,计算以每一个字符开头的所有无重复子串的长度,最后比较这些长度,找出最大的一个。在每一次的循环中,我们用哈希表来统计有无重复的字符。本题比较简单,直接上代码。code:int l原创 2017-08-07 20:47:36 · 500 阅读 · 0 评论 -
环形链表插值
在一个环形单链表中插入一个值为val的结点,使得插入后的链表仍然有序。分析:我们设置两个指针,分别指向链表中的某一个结点和下一个结点,如果val的值在其中间,则将对应结点插入这两个结点中间,如果val的值比所有的结点值都大,则插入在头结点的前面,如果val的值比所有的值都小,则也插入在头结点前面,不过返回值应该是这个新的结点。//链表结构struct LinkList{ int原创 2017-08-09 08:46:31 · 521 阅读 · 0 评论 -
经典动态规划问题总结
动态规划引入首先我们以一个最基本的例子来分析——菲波那切数列。我们都知道,菲波那切数列的递推公式f(n) = f(n-1)+f(n-2) (这里我就说明一般情况,不列举边界条件了),很简单,如果我们用递归的方法来求解f(n),两三行代码就出来了。那么我们深入分析一下这样有什么问题?f(2) = f(1) + f(0);f(3) = f(2) + f(1);f(4) = f(原创 2017-08-16 17:25:37 · 731 阅读 · 0 评论 -
排序数组中的相邻两数最大差值
给定一个数组A及其大小n,求其排序后的相邻两数的最大差值。(注:要求时间复杂度为O(n))思路:题目要求对排序后的数组进行操作,显然需要先对数组进行排序。如果没有要求时间复杂度,那么可以有很多种排序算法,如快速排序、堆排序、归并排序等等。但是这里要求时间复杂度为O(n),就不能用上述常规的排序算法了。那么桶排序可以吗?由于我们不知道最大数的位数,因此,如果最大数的位数很大的话,我们原创 2017-08-07 10:45:06 · 2786 阅读 · 1 评论 -
字符串中单词的逆转
实现字符串中单词的逆转,即将单词出现的顺序进行逆转。如将"Today is Friday!"逆转为"Friday! is Today"。思路:不使用额外空间完成,可以分为两步。首先将字符串全部逆转,比如:"Today is Friday!"逆转为"!yadirF si yadoT",然后通过空格分割单词,单词自身进行逆转。代码如下://Reverse实现一个字符串的全部原创 2017-05-16 09:09:10 · 1176 阅读 · 0 评论 -
C/C++中volatile关键字详解
1.为什么用volatile?c/c++中的volatile关键字和const对应,用来修饰变量,通常用于建立语言级别的memory barrier。这是BS在“The C++ Programming Language”对volatile修饰词的说明:"A volatile specifier is a hint to a complier that an object may cha转载 2017-08-27 00:31:31 · 391 阅读 · 0 评论 -
C++的精髓—虚函数
虚函数是为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的函数!纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数!虚函数引入原因:为了方便使用多态性,我们常常需要在基类中定义虚函数。class CMan{public: virtual void Eat(){......}; void Move();priva转载 2016-05-16 21:10:45 · 528 阅读 · 0 评论 -
类对象作为函数参数
网上看见一段代码,是关于类对象作为函数的参数,其中有几点知识,贴出来大家一起学习。直接来看代码:#include #include using namespace std;class people {private: char *name; int age;public: people(char *namestr,int i); ~people(); char *原创 2017-02-21 21:02:14 · 11973 阅读 · 2 评论 -
C/C++中static关键字
什么是静态变量?简单点说,静态变量其实可以当做全局变量,但是和普通的全局变量不同的是该静态变量只能在其声明的作用域中使用,出了这个作用域就不能用了。静态变量类型?在函数内部声明的静态变量其实就是一个全局变量,只不过它只能在函数内部使用;在函数外声明的,有两种,一种是类中的成员,另一种就是文件作用域的静态变量。有文件作用域的静态变量只能在包含它的.c文件中使用,如果是声明在头原创 2016-12-08 14:30:21 · 389 阅读 · 0 评论 -
Effecticve学习笔记_条款45:运用成员函数模板接收所有兼容类型
假设有一个基类和一个派生类像下面这样:class Base{};class Derived : public Base{}; 由于类间的上行转换时安全的,我们可以得到如下的正确结果:Derived* d;Base* b = static<Base*>d; 下面我们自己写一个简单的SharedPtr智能指针类:template<typename T>class SharedPtr{p原创 2016-08-26 11:44:15 · 602 阅读 · 0 评论 -
Effecticve学习笔记_条款46:需要类型转换时请为模板定义非成员函数
条款24已经讨论过为什么惟有non-member函数才有能力“在所有实参身上实施隐式类型转换”,这里还以Rational class的operator*函数为例。 这里将Rational和operator*模板化了:template<typename T>class Rational{public: Rational(const T& numerator = 0, const T原创 2016-08-31 11:52:34 · 454 阅读 · 0 评论 -
C++编译期多态与运行期多态
概述现在的C++已经不是单纯的”带类的C”,它已经发展成为一个多种次语言所组成的语言集合,其中泛型编程与基于它的STL是C++发展中最为出彩的那部分。在面向对象C++编程中,多态是OO三大特性之一,这种多态称为运行期多态,也称为动态多态;在泛型编程中,多态基于template(模板)的具现化与函数的重载解析,这种多态在编译期进行,因此称为编译期多态或静态多态。在本文中,我们将了解: 1.什么是运行转载 2016-08-23 10:12:12 · 322 阅读 · 0 评论 -
智能指针之shared_ptr
在智能指针中,auto_ptr已经使用的越来越少了,特别是在C++11中,它已经被shared_ptr取代,原因主要有以下两点:auto_ptr不能保留指针所有权class Test{public: Test(int m) : m_test(m) {} ~Test();public: int m_test;};/*********************/voi原创 2016-08-18 20:26:15 · 229 阅读 · 0 评论 -
C++类型转换之static_cast和dynamic_cast
static_cast (1)用于基本的数据类型转换test_enum type = test_enum_1;char a ;int b = static_cast<int>(a);char c = static_cast<char>(b);type = static_cast<test_enum>(b);char* pa = NULL;int *pb = (int*)pa;//int原创 2016-08-17 10:46:20 · 458 阅读 · 0 评论 -
C++中类型转换—static_cast,dynamic_cast,const_cast
关于C++中基本数据类型的显示转换就不再详细介绍了,这里主要介绍隐式转换中static_cast,dynamic_cast,const_cast和reinterpret_cast用法的区别。(1)static_cast **用法:**static_cast(expression) 说明:该运算符把expression转换为typeid类型,但没有运行时类型检查来确保转换的安全性。 用途:用于原创 2016-05-17 11:14:20 · 530 阅读 · 0 评论 -
C++中this指针的用法详解
1. this指针的用处 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。例转载 2016-05-11 11:36:19 · 647 阅读 · 0 评论 -
C++模板与泛型编程基础
泛型编程就是以独立于任何特定类型的方式编写代码,而模板是反省编程的基础。 (1)定义函数模板(function template) 函数模板是一个独立于类型的函数,可以产生函数的特定类型版本。// implement strcmp-like generic compare functiontemplate<typename T>int compare(const T &v1, const T转载 2016-05-10 11:26:06 · 483 阅读 · 0 评论 -
智能指针使用介绍
目录 1. 智能指针背后的设计思想 2. C++智能指针简单介绍 3. 为什么摒弃auto_ptr ? 4. unique_ptr为何优于auto_ptr ? 5. 如何选择智能指针 ?正文1. 智能指针背后的设计思想 我们先来看一个简单的例子:void remodel(std::string & str){ std::string * ps = new std::string转载 2016-05-08 22:20:14 · 470 阅读 · 0 评论 -
C++中关于get()和getline()函数读取行的问题
1.面向行的输入:getline() getline()函数读取整行(读取格式为cin.getline()),它使用通过回车键输入的换行符来确定输入结尾。该函数有两个参数,第一个参数是用来存储输入行的数组名称,第二个参数是要读取的字符数。getline()函数在读取指定书目的字符或遇到换行符时停止读取。并且该函数不保留最后的换行符。2.面向行的输入:get() get()成员函数有多个变体,其中原创 2016-03-25 16:43:03 · 5029 阅读 · 0 评论 -
Effective C++学习笔记_条款43:学习处理模板化基类内的名称
有两个不同的公司,想发送不同的消息给这个两个公司,消息可以是明文,也可以是译成密码的形式发送。于是我们采用动态绑定。先定义一个发送消息的类BaseSendMsg,包含SendMsgTxt以及SendMsgSecret两个virtual函数,然后另外定义两个类CompanyA和CompanyB,这两个类分别继承BaseSendMsg,并分别重写自己的发送消息的函数。 但是我们这里想换一种思路,使原创 2016-08-24 15:24:07 · 358 阅读 · 0 评论 -
Effective C++学习笔记_条款42:了解typename的双重意义
本节介绍typename的两个用法。首先是一种常用的,让我们看一下下面两句:template<class T> class Widget; //使用“class”template<typename T> class Widget; // 使用“typename” 那么上述的class和typename有什么不同吗?答案是没有不同。二者都是声明template类型参数。这是我们最常见的一种t原创 2016-08-24 15:39:17 · 296 阅读 · 0 评论 -
Effective C++学习_条款44:将与参数无关的代码抽离
当你编写某个函数,而你明白其中某些部分的实现码和另一个函数的实现码实质相同,你会很单纯地重复这些码吗?当然不。你会抽出两个函数的共同部分,把他们放进第三个函数,然后令原先两个函数调用这个新函数。同样道理,在编写类的时候你也会以相同的方式来避免重复。 举个 例子:假设 你想为一个尺寸固定的正方矩阵编写一个template。该矩阵的性质之一是支持逆矩阵运算。template<typename T, s原创 2016-08-25 10:17:08 · 379 阅读 · 0 评论 -
C/C++中内存对齐方式
我们平时在学习中或是在做一些面试题的过程中,可能会经常碰到让你填写一个数据结构或者一个类的大小的题目,那么这种类型的题目就涉及到了内存对齐问题,下面就详细的给大家介绍一下。一. 什么是对其方式,以及为什么要对对齐?1,现在原创 2016-10-25 22:45:05 · 392 阅读 · 0 评论 -
C/C++中extern关键字的用法
1.基本解释:extern关键字可以置于变量或函数前,以标示变量或者额函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块 中寻找其定义。另外,extern也可以用来进行连接指定(即"extern C"的用法)。详细内容暂时参考C/C++中extern关键字详解原创 2016-11-30 16:42:56 · 362 阅读 · 0 评论 -
堆和栈理论以及程序内存分配
一. 预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分:栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表;全局(静态区)(static):全局变量原创 2016-12-13 23:40:50 · 499 阅读 · 0 评论 -
迭代器之配接器
本文介绍三种常用的配接器,insert_iterator,stream_iterator和reverse_iterator。安插性迭代器(insert_iterator) 该类型迭代器主要有三种: back_inserter, 该迭代器只能用于有push_back方法的容器; front_inserter,该迭代器只能用于有push_front方法的容器,即list和deque; inse原创 2016-07-14 10:56:06 · 418 阅读 · 0 评论