-
实现auto_ptr的两种方法
我们都知道,实现auto_ptr有两种方法:第一种方法:在上一篇博客中我已经实现了,主要思想是管理权转移。第二种方法:它是我们c++标准库中以前的一个版本,主要思想是在auto_ptr类中除了有一个指针的成员变量以外还有一个bool类型的成员变量_owner。构造函数中将_owner设为真,表示对象是指针所指向的内存的拥有者,当要赋值时(ap1=ap2),将ap1的_owner置为true,ap2
-
模拟实现c++标准库和boost库中的智能指针
我们知道c++标准库中定义了智能指针auto_ptr,但是我们很少用它,因为虽然它能够自动回收动态开辟的内存,不需要程序员自己去维护动态开辟的内存,但是当用它去赋值或者是拷贝构造时有一个管理权转移的过程,这样我们就不能很方便的使用auto_ptr。下面是简单的auto_ptr的实现,我们可以看到在复制和赋值时它将转移管理权。template<class T>
class&n
-
c++模板实现双向链表
#include<iostream>
#include<string>
using namespace std;
template<typename T>
struct Node
{
Node(const T& d)
&nb
-
C++模板实现顺序表
#include<iostream>
#include<string>
using namespace std;
template<typename T>
class SeqList
{
public:
SeqList()
&
-
探索c++对象模型
c++中多态的实现我们都知道,c++中的多态是在虚函数的基础上实现的,用指向派生类的基类指针调用派生类(或基类)中自己的成员函数。那么,具体是怎么实现的呢?其实它是通过虚函数表来实现的,虚函数表是保存虚函数地址的一张表,若一个类中有虚函数,当程序运行时,编译器通过在虚函数表中查找相应的虚函数的地址来调用该函数。 对象的继承有如下几类:1.单一继承2.多重继承3.重复继承(钻石继承)4.虚
-
string类的写时拷贝
由于浅拷贝使多个对象共用一块内存地址,调用析构函数时导致一块内存被多次释放,导致程序奔溃。实现string类的时候通常显示的定义拷贝构造函数和运算符重载函数。 由于释放内存空间,开辟内存空间时花费时间,因此,在我们在不需要写,只是读的时候就可以不用新开辟内存空间,就用浅拷贝的方式创建对象,当我们需要写的时候才去新开辟内存空间。这种方法就是写时拷贝。 在构造函数中开辟新的空间时多
-
string类的两种实现方法及string的一些成员函数的实现
string的第一种实现方法:#include<iostream>
using namespace std;
class String
{
public:
String(char *str="")//构造函数
:_s
-
模拟new[]和delete[]操作符开辟内存空间及释放内存空间过程
在上一篇博客里我们知道了new[]和delete[]开辟空间和释放空间时过程,那么我们可不可以模拟实现一下它们的开辟内存和释放内存的过程呢?下面是我模拟new[]和delete[]的实现过程:根据上图我们可以模拟new[]和delete[]的操作过程#include<iostream>
#include<stdlib.h>
using namespace 
-
c++动态内存管理
我们都知道在c++中可以用new/malloc动态分配内存空间用delete/free释放动态开辟的内存空间。c++中的malloc/free是继承c语言中的malloc/free,它的用法和在C语言中的用法一模一样。 1.那么既然c++中有了可以动态开辟内存的函数为什么又要有new/delete呢?我们知道malloc只是单纯的开辟内存空间而不进行初始化,free只是将动态开辟的内存空
-
旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转,输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}是数组{1,2,3,4,5}的一个旋转,该数组的最小值为1。题目分析:我们可以通过旋转以后的数组中的元素的分布方式找出其中的一些规律:数组{3,4,5,1,2}中,最左边的数字(3)大于最右边的数字(2),由于原数组是递增排序的,所以左边的
-
实现日期类
题目:实现一个日期类,主要实现日期计算功能:日期+天数=日期;日期-天数=日期;日期-日期=天数;要实现该日期类,必须熟练掌握运算符重载的概念和实现方法。以下是编写的一个日期类: 头文件:#ifndef __DATE_H__
#define __DATE_H__
#include<iostream>
using namespace st
-
c++实现复数类
主要是练习用运算符重载实现复数的一些基本运算,包括:复数加法(重载的运算符:+、+=、前置++、后置++);复数减法(重载的运算符:-、-=、前置--、后置--);复数乘法(重载的运算符:*、*=、);复数除法(重载的运算符:/、/=、);代码如下:#include<iostream>
using namespace std;
class Complex
-
用结构体数组实现通讯录
课题:实现一个通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址 该通讯录可以提供以下功能:1. 添加联系人信息2. 删除指定联系人信息3. 查找指定联系人信息4. 修改指定联系人信息5. 显示所有联系人信息6. 清空所有联系人7. 以名字排序所有联系人分析:首先我们可以定义出存储每个
-
用冒泡排序的方法模拟实现qsort函数
分析:用冒泡排序的方法实现快速排序主要是用回调函数的知识,我们知道库函数中qsort的函数原型是: void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );函数原型中qsort函数有四个参数,分别为base:是指目标
-
用冒泡排序—整数序列、字符串序列
分析:冒泡排序原理:如果升序排序,将一组整数序列的第一个元素和第二个元素相比较,如果第一个元素大于第二个元素,那么交换这两个元素,如果不满足条件就不交换;然后将第二个元素和第三个元素比较,直到和最后一个元素和它前面的一个元素比较后,第一次排序完成,最大的一个数在最后。最多排序n-1次(设有n个元素),就可排序完成。过程如下图: 排序字符串序列也是根据这个原理,只是将比较两个数
-
一些常用函数模拟实现
我们库函数中提供给我们很多函数,我们虽然不需要自己去实现这些函数,但是我认为自己亲自去实现一下这些函数对我们有很大的好处。我们可以根据自己的想法实现这些函数的功能,然后再看一下库里面是怎么实现它们的,比较一下,看看函数的实现方式的异同之处,这样我们可以找出自己的不足之处,学习库函数的实现思维,帮助我们提升编程能力。下面是一些函数的实现: strstr函数的实现:char *my
-
用三种方法实现strlen函数
实现strlen函数有三种方法:一、计数器的方法二、递归的方法三、指针减指针的方法下面是三种方法的实现:计数器的方法:int my_strlen(const char *str)
{
assert(str); //对指向字符串指针的断言
int count = 0
-
打印1到最大的n位数
打印1到最大的n位数即是:若n=1,则打印1到最大的一位数即是1,2,3,4,5,6,7,8,9;若n=2,那么打印1到最大的两位数1到99;虽然我们可以直接用printf输出,但是当n很大的时候,用整型和长整型都会溢出。为了表示一个大数字我们可以用数组或者字符串来表示,下面是用字符串解决大数的问题。分析:1.首先我们需要一个长度为n+1的字符串,用来表示数字的每一位。字符串的最后一个是'\0';
-
用可变参数列表模拟实现printf函数
用可变参数列表实现printf函数要实现printf函数,我们首先应该获取printf函数中由双引号中的字符串,若遇到不是%的字符,我们应该直接将其输出,若遇到%,我们应该判断它后面是什么字符,这里先只考虑%c,%s的情况,如果是%c那么我们应该将读到的字符输出来,若为%s,应该将读到的字符串通过指针解引用的方式依次输出,如果是%d%f我们暂且将它当做普通字符输出。实现的代码如下:#include
-
将一个字符串逆序(用递归实现不能使用库函数)
将两个字符串逆序可以设置两个指针,一个指向字符串首地址start,一个指向字符串末尾元素的地址(‘\0’前面的元素的地址)end,只要start<end,就将两个地址所指向的元素交换。实现代码如下:#include<stdio.h>
#include<string.h>
void reverse(char *str)
{
&
xyzbaihaiping
分享到朋友圈
- 关注技术:C/C++ Java 数据结构与算法
- 入住博客:2015-10-10 4.2年
七日热门
最近来访