服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++详解如何实现动态数组

C++详解如何实现动态数组

2023-02-14 15:29肩上风骋 C/C++

这篇文章主要为大家详细介绍了C++实现动态数组的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

动态数组

动态数组Vector可以动态扩展内存,其采用连续的内存空间,当内存空间不足,便以原来的容量的2倍或者1.5倍成倍的扩展,将原有的数组元素拷贝到新分配的内存空间中,释放原有的内存空间,新的元素将存入的新分配的内存空间。

示例代码

动态数组vector的size函数和capacity函数,分别作为求数组中现有的元素的个数和数组所能容纳的元素的个数。下面直接上实现的代码。

DynamicArray .h

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once
class DynamicArray {
public:
    DynamicArray();
    ~DynamicArray();
    void push_back_Array(int value);
    void insertValueByPosArray(size_t pos,int value);
    void removeByValueFromArray(int value);
    void removeByPosFromArray(size_t pos);
    int findPosByValueArray(int value);
    int findValueByPosArray(size_t pos);
    void reclaimSpaceArray();
    void clearArray();
    int getCapacity();
    int getCount();
    void printArray();
private:
    int *m_pArr;
    size_t m_size;
    size_t m_capacity;
};

DynamicArray .cpp

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include "DynamicArray.h"
#include <iostream>
using namespace std;
// DynamicArray.cpp
DynamicArray::DynamicArray()
{
    m_size = 0;
    m_capacity = 20;
    m_pArr = new int[m_capacity];
    if (m_pArr == nullptr)
    {
        cout << "new 开辟空间失败" << endl;
    }
}
DynamicArray::~DynamicArray()
{
    if (m_pArr != nullptr)
    {
        delete[] m_pArr;
        m_pArr = nullptr;
    }
    m_size = 0;
    m_capacity = 0;
}
void DynamicArray::push_back_Array(int value)//push_back
{
    if (m_pArr == nullptr)
    {
        return;
    }
    reclaimSpaceArray();
    m_pArr[m_size] = value;
    m_size++;
}
void DynamicArray::insertValueByPosArray(size_t pos, int value)//插入insert(可以在前,中,后插入)
{
    if (m_pArr == nullptr)
    {
        return;
    }
    reclaimSpaceArray();
    for (size_t i = m_size - 1; i >= pos; --i)//pos为下标的数,从0开始
    {
        m_pArr[i + 1] = m_pArr[i];
    }
    m_pArr[pos] = value;
    m_size++;
}
void DynamicArray::removeByValueFromArray(int value)
{
    if (m_pArr == nullptr)
    {
        return;
    }
    int nPos = findPosByValueArray(value);
    removeByPosFromArray(nPos);
}
void DynamicArray::removeByPosFromArray(size_t pos)//pos为下标的数,从0开始
{
    if (m_pArr == nullptr)
    {
        return ;
    }
    if (pos < 0 || pos >= m_size)//pos的最大值为m_size-1
    {
        return ;
    }
    //找到被删除位置的下一位
    for (size_t i = pos + 1; i < m_size; ++i)
    {
        m_pArr[i - 1] = m_pArr[i];
    }
    m_size--;
}
int DynamicArray::findPosByValueArray(int value)
{
    size_t nPos = -1;
    if (m_pArr == nullptr)
    {
        return nPos;
    }
    for (size_t i = 0; i < m_size; ++i)
    {
        if (m_pArr[i] == value)
        {
            nPos = i;
            break;
        }
    }
    return nPos;
}
int DynamicArray::findValueByPosArray(size_t pos)
{
    if (m_pArr == nullptr)
    {
        return -1;
    }
    if (pos < 0 || pos >= m_size)
    {
        return -1;
    }
    return m_pArr[pos];
}
void DynamicArray::reclaimSpaceArray()
{
    if (m_size == m_capacity)
    {
        int *newArr = new int[m_capacity * 2];
        if (newArr == nullptr)
        {
            cout << "new 开辟空间失败" << endl;
            return;
        }
        memset(newArr, 0, m_capacity * 2 * sizeof(int));//第三个参数为字节数
        memcpy(newArr, m_pArr, m_size * sizeof(int));//第三个参数为字节数
        //下面这种逐个赋值的方式也可以使用
        //for (size_t i = 0; i < m_capacity; i++)
        //{
        //  newArr[i] = m_pArr[i];
        //}
        m_capacity = m_capacity * 2;
        if (m_pArr) {
            delete[] m_pArr;
            m_pArr = nullptr;
        }
        m_pArr = newArr;
    }
}
void DynamicArray::clearArray()//vector中clear()只是改变size的大小
{
    m_size = 0;
}
int DynamicArray::getCapacity()
{
    return m_capacity;
}
int DynamicArray::getCount()
{
    return m_size;
}
void DynamicArray::printArray()
{
    for (size_t i = 0; i < m_size; ++i)
    {
        //下面两种方式打印都可以
        cout << m_pArr[i] << " ";
        //int ret = findValueByPosArray(i);
        //cout<< ret<< " ";
    }
    cout << endl;
}

main.cpp

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include "DynamicArray.h"
using namespace std;
void test() {
    DynamicArray * pArray = new DynamicArray;
    int i = 0;
    while (i++ < 11)
    {
        pArray->push_back_Array(i);
    }
    pArray->printArray();
    cout <<"size= "<< pArray->getCount() << endl;
    cout << "容量: " << pArray->getCapacity() << endl;
    pArray->insertValueByPosArray(5,12);
    pArray->printArray();
    cout << "insert after size= " << pArray->getCount() << endl;
    cout << "insert after 容量: " << pArray->getCapacity() << endl;
    pArray->removeByValueFromArray(2);
    pArray->printArray();
    cout << "remove after size= " << pArray->getCount() << endl;
    cout << "remove after 容量: " << pArray->getCapacity() << endl;
    pArray->removeByPosFromArray(3);
    pArray->printArray();
    cout << "remove by pos after size= " << pArray->getCount() << endl;
    cout << "remove by pos after 容量: " << pArray->getCapacity() << endl;
    cout<<"find 2 of pos: "<<pArray->findPosByValueArray(2)<<endl;
    cout << "find 8 of pos: " << pArray->findPosByValueArray(8) << endl;
    cout << "value at pos of 6: " << pArray->findValueByPosArray(6) << endl;
    pArray->clearArray();
    cout << "size= " << pArray->getCount() << endl;
    cout << "容量: " << pArray->getCapacity() << endl;
    if (pArray)
    {
        delete pArray;
        pArray = nullptr;
    }
}
int main()
{
    test();
    return 0;
}

运行环境

以上代码的运行环境为:vs2017控制台输出程序。

运行效果

C++详解如何实现动态数组

以上仅供记录。可帮助理解vector。

到此这篇关于C++详解如何实现动态数组的文章就介绍到这了,更多相关C++动态数组内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/blqzj214817/article/details/125315822

延伸 · 阅读

精彩推荐
  • C/C++C++设计模式编程之Flyweight享元模式结构详解

    C++设计模式编程之Flyweight享元模式结构详解

    这篇文章主要介绍了C++设计模式编程的Flyweight享元模式结构,享元模式在实现过程中主要是要为共享对象提供一个存放的"仓库"(对象池),需要的朋友可以参考...

    梦在天涯5172021-03-28
  • C/C++C++二叉树结构的建立与基本操作

    C++二叉树结构的建立与基本操作

    二叉树是数据结构中的树的一种特殊情况,有关二叉树的相关概念,这里不再赘述,如果不了解二叉树相关概念,建议先学习数据结构中的二叉树的知识点...

    C++教程网9932021-01-06
  • C/C++解析C++中不能重载为友元函数的四个运算符

    解析C++中不能重载为友元函数的四个运算符

    以下是对C++中不能重载为友元函数的四个运算符进行了详细的分析介绍,需要的朋友可以过来参考下...

    C++教程网2972020-12-21
  • C/C++C语言判定一棵二叉树是否为二叉搜索树的方法分析

    C语言判定一棵二叉树是否为二叉搜索树的方法分析

    这篇文章主要介绍了C语言判定一棵二叉树是否为二叉搜索树的方法,结合实例形式综合对比分析了C语言针对二叉搜索树判定的原理、算法、效率及相关实现...

    xiaofei08597242021-07-01
  • C/C++C++实现投骰子的随机游戏

    C++实现投骰子的随机游戏

    这篇文章主要为大家详细介绍了C++实现投骰子的随机游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    黑盒子Key5162022-11-02
  • C/C++让应用程序只运行一个实例的实现方法

    让应用程序只运行一个实例的实现方法

    我们在使用《360软件管家》时发现,在《360软件管家》已经运行了的情况下,再次点击《360软件管家》的图标,那么它不会再运行另外一个《360软件管家》...

    C语言教程网2032020-11-24
  • C/C++C语言如何正确的终止正在运行的子线程

    C语言如何正确的终止正在运行的子线程

    这篇文章主要介绍了C语言如何正确的终止正在运行的子线程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    大熊(先生)6122021-07-21
  • C/C++C/C++产生随机数函数简单介绍

    C/C++产生随机数函数简单介绍

    这篇文章主要为大家详细介绍了C/C++产生随机数函数的实现方法,如何使用C/C++产生随机数函数,感兴趣的小伙伴们可以参考一下...

    daisyWXH8132021-03-30