织梦新手网站建设,建筑工程公司资质,js网站源码下载,wordpress分类目录顺序C笔记之动态数组的申请和手动实现一个简单的vector
code review! 文章目录 C笔记之动态数组的申请和手动实现一个简单的vector1.C语言中动态数组的申请与使用1.动态数组的申请使用new和delete使用std::vector 1.std::vector的底层实现2.手动实现一个简单的vector:使用一个指向…C笔记之动态数组的申请和手动实现一个简单的vector
code review! 文章目录 C笔记之动态数组的申请和手动实现一个简单的vector1.C语言中动态数组的申请与使用1.动态数组的申请使用new和delete使用std::vector 1.std::vector的底层实现2.手动实现一个简单的vector:使用一个指向动态分配的数组的指针来存储元素模拟vector的基本行为 1.C语言中动态数组的申请与使用
在C语言中可以使用malloc函数来动态申请内存以创建动态数组并使用free函数来释放这些内存。以下是在C语言中创建和使用动态数组的基本示例
代码
#include stdio.h
#include stdlib.hint main() {int size;printf(Enter the size of the dynamic array: );scanf(%d, size);// 使用malloc函数分配动态数组内存int *dynamicArray (int *)malloc(size * sizeof(int));// 检查内存分配是否成功if (dynamicArray NULL) {printf(Memory allocation failed.\n);return 1; // 返回错误码}// 初始化动态数组的元素for (int i 0; i size; i) {dynamicArray[i] i * 2;}// 访问和使用动态数组的元素for (int i 0; i size; i) {printf(%d , dynamicArray[i]);}// 释放动态数组内存free(dynamicArray);return 0;
}在上述示例中首先使用malloc函数分配了一块内存该内存可以存储size个int类型的元素。然后通过循环初始化和使用动态数组的元素。最后使用free函数释放分配的内存以防止内存泄漏。
请注意使用malloc和free来管理内存需要特别小心确保在不再需要动态数组时释放内存以免出现内存泄漏。此外动态数组的内存大小必须在运行时明确定义并且需要手动处理分配和释放内存这可能会引入错误因此要特别小心。如果可能的话推荐使用C中的std::vector或C语言的动态数组分配方式如alloca或strdup以减少手动内存管理的复杂性。
1.动态数组的申请
在C中可以使用new运算符来动态申请数组并使用delete运算符来释放它们。此外C11引入了std::vector它是一个动态数组的封装提供了更方便和安全的方法来管理动态数组。下面分别介绍使用new和std::vector的方法来创建和使用动态数组。
使用new和delete 代码
#include iostreamint main() {int size;std::cout Enter the size of the dynamic array: ;std::cin size;// 通过new运算符分配动态数组int* dynamicArray new int[size];// 初始化动态数组的元素for (int i 0; i size; i) {dynamicArray[i] i * 2;}// 访问和使用动态数组的元素for (int i 0; i size; i) {std::cout dynamicArray[i] ;}// 释放动态数组内存delete[] dynamicArray;return 0;
}使用new分配动态数组后不要忘记使用delete[]释放内存以防止内存泄漏。
使用std::vector
使用std::vector可以更方便地管理动态数组无需手动分配和释放内存
#include iostream
#include vectorint main() {int size;std::cout Enter the size of the dynamic array: ;std::cin size;// 使用std::vector创建动态数组std::vectorint dynamicArray(size);// 初始化动态数组的元素for (int i 0; i size; i) {dynamicArray[i] i * 2;}// 访问和使用动态数组的元素for (int i 0; i size; i) {std::cout dynamicArray[i] ;}return 0;
}std::vector会自动处理内存分配和释放使得代码更加安全和易维护。
无论您选择使用new和delete还是std::vector都要确保正确管理动态数组的内存以防止内存泄漏和访问越界错误。
1.std::vector的底层实现
C中的vector是标准库中的一个动态数组容器它提供了动态大小的数组类似于C数组但它具有自动管理内存的功能可以动态增加或减少数组的大小。vector的底层实现通常是使用动态分配的数组以及一些成员函数来管理这个数组的大小和元素。
下面是vector的一些常见底层实现细节 动态分配的数组vector内部通常使用一个指向动态分配的数组的指针来存储元素。这个数组的大小可以根据vector中存储的元素数量动态调整。当元素数量超过当前数组的容量时vector会分配一个更大的数组将元素从旧数组复制到新数组然后释放旧数组。 容量Capacity和大小Sizevector有两个重要的属性容量和大小。容量表示当前数组的大小而大小表示vector中实际存储的元素数量。容量通常大于或等于大小因为vector可能会提前分配一些额外的空间以减少频繁重新分配内存的开销。 动态调整容量当vector的大小超过容量时它会重新分配更大的内存块并将元素从旧数组复制到新数组。这通常涉及到内存分配和复制操作这可能会导致性能开销。为了减小重新分配的频率vector通常会分配比当前大小更多的额外空间以避免在每次插入元素时都重新分配内存。 内存管理vector负责动态内存的分配和释放以确保内存的正确管理。当vector不再需要某个内存块时它会调用delete[]或allocator::deallocate来释放内存。 迭代器vector提供了迭代器用于访问容器中的元素。迭代器是指向容器中元素的指针或对象允许你遍历vector的内容。
总之vector的底层实现是基于动态分配的数组它使用内部指针来管理内存并提供了各种方法来操作容器中的元素包括插入、删除、访问等。这些实现细节在C标准库中是隐藏的因此你可以方便地使用vector而无需担心底层实现的细节。
2.手动实现一个简单的vector:使用一个指向动态分配的数组的指针来存储元素模拟vector的基本行为 运行
代码
#include iostreamclass MyVector {
public:MyVector() : data(nullptr), size(0), capacity(0) {}void push_back(int value) {if (size capacity) {// 如果当前大小超过容量需要重新分配更大的内存int new_capacity (capacity 0) ? 1 : capacity * 2;int* new_data new int[new_capacity];// 将数据从旧数组复制到新数组for (int i 0; i size; i) {new_data[i] data[i];}// 释放旧数组的内存delete[] data;// 更新指针和容量data new_data;capacity new_capacity;}// 在数组末尾添加新元素data[size] value;size;}int at(int index) {if (index 0 index size) {return data[index];} else {std::cerr Index out of range! std::endl;return -1;}}int getSize() {return size;}~MyVector() {delete[] data; // 释放动态分配的内存}private:int* data; // 指向动态分配的数组的指针int size; // 当前元素数量int capacity; // 当前容量
};int main() {MyVector vec;// 向自定义的vector中添加一些元素for (int i 1; i 10; i) {vec.push_back(i * 10);}// 访问元素并打印for (int i 0; i vec.getSize(); i) {std::cout Element at index i : vec.at(i) std::endl;}return 0;
}