IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ 可变长数组类的实现 -> 正文阅读

[C++知识库]C++ 可变长数组类的实现

可变长数组类的实现

成员变量:size表示元素的个数,ptr指针指向动态分配的数组

成员函数:拷贝构造函数,析构函数释放空间

重载运算符 '='? ?用于对象间的赋值

重载运算符“[]” 用以支持根据下标访问数组元素

'push_back函数 用于在数组尾部添加一个元素

length 函数 用于返回数组的长度

程序实现如下:

#include <iostream>
#include <cstring>
using namespace std;

class CArray {
private:
    int size;//数组元素的个数
    int* ptr;//指向动态分配的数组
public:
    CArray(int s = 0);  //s代表数组元素的个数
    CArray(CArray& a);  //拷贝构造函数
    ~CArray();          //析构函数
    void push_back(int v);//用于在数组尾部添加一个元素v
    CArray& operator = (const CArray& a);//用于对象间的赋值
    int length() { return size; }
    //非引用的函数返回值不可以作为左值使用
    int& operator[](int i);//返回值为int 不支持a[i] = 4
};

CArray::CArray(int s) :size(s)
{
    if (s == 0)
        ptr = NULL;
    else
        ptr = new int[s];
}

CArray::CArray(CArray& a)//拷贝构造函数的实现
{
    if (!a.ptr) {
        ptr = NULL;
        size = 0;
        return;
    }
    ptr = new int[a.size];
    memcpy(ptr, a.ptr, sizeof(int) * a.size);
    //a.ptr指向的内容拷贝到ptr 拷贝了sizeof(int) * a.size个字节
    size = a.size;
}

CArray::~CArray()
{
    if (ptr) delete[]ptr;
}

CArray& CArray::operator=(const CArray& a)
{
    if (ptr == a.ptr)       //防止a = a这样的赋值导致出错
        return *this;
    if (a.ptr == NULL) {    //如果a里面的数组是空的
        if (ptr) delete[]ptr;
        ptr = NULL;
        size = 0;
        return *this;
    }
    if (size < a.size) {
        if (ptr)
            delete[] ptr;
        ptr = new int[a.size];
    }
    memcpy(ptr, a.ptr, sizeof(int) * a.size);
    size = a.size;
    return *this;
}

int& CArray::operator[](int i)
{
    return ptr[i];
}

void CArray::push_back(int v)//在数组尾部添加一个元素
{
    if (ptr) {
        int* tmpPtr = new int[size + 1];//重新分配空间
        memcpy(tmpPtr, ptr, sizeof(int) * size);//拷贝原数组内容
        delete[]ptr;
        ptr = tmpPtr;
    }
    else   //数组本来是空的
        ptr = new int[1];
    ptr[size++] = v;//加入新的数组元素
}
int main()
{
    CArray v;
    for (int i = 0; i < 5; i++) {
        v.push_back(i);
    }
    CArray v2, v3;
    v2 = v; 
    for (int i = 0; i < v.length(); i++) {
        cout << v2[i] << " ";//输出0 1 2 3 4
    }
    v2 = v3;//v2空的
    for (int i = 0; i < v2.length(); i++) {
        cout << v2[2] << " ";
    }
    cout << endl;
    v[3] = 100;
    CArray v4(v);
    for (int i = 0; i < v4.length(); i++) {
        cout << v4[i] << " ";//输出0 1 2 100 4
    }
    return 0;
}

?关于push_back()成员函数的实现

每添加入一个元素便重新分配空间, 这是十分低效的做法,比如可以每次开空间的时候开32个, 每次到32个,时再开32个 ,这样就避免了每次都要重新分配空间,提高效率。

标准模板库中的vector的push_back原理:

vector有预存的内存(capacity),如果存入的元素大于了capacity,就重新分配一个比原来capacity大两倍的内存。

?摘自:

程序设计与算法(三)C++面向对象程序设计

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-31 23:45:54  更:2022-03-31 23:48:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:02:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码