【C++游记】Vector的使用和模拟实现

枫の个人主页

你不能改变过去,但你可以改变未来

算法/C++/数据结构/C

Hello,这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕,我们继续来学习C++的内容呀。C++是接近底层有比较经典的语言,因此学习起来注定枯燥无味,西游记大家都看过吧~,我希望能带着大家一起跨过九九八十一难,降伏各类难题,学会C++,我会尽我所能,以通俗易懂、幽默风趣的方式带给大家形象生动的知识,也希望大家遇到困难不退缩,遇到难题不放弃,学习师徒四人的精神!!!故此得名【C++游记】
话不多说,让我们一起进入今天的学习吧~~~

目录

[1>> Vector容器](#1>> Vector容器)

1.1>>定义:

1.2>>迭代器Iterator使用

1.3>>vector空间

1.4>>vector增删改查

2>>部分模拟实现

2.1>>Test.cpp

2.2>>Vector.h

3>>结语


1>> Vector容器

它与所有STL模板一样,都有着三大境界:筑基期(会用)、结丹期(知道原理)、

元婴期(能自己扩展,造轮子给别人使用)

1.1>>定义:

|--------------------------------------------------------------------------|--------------|
| 构造函数声明 | 接口说明 |
| vector() | 无参数构造 |
| vector (size_type n,const value_type& val = value_type()) | 构造并初始化n个val |
| vector(const vector& x); | 拷贝构造 |
| vector(Inputlterator first,Inputlterator last); | 使用迭代器进行初始化构造 |

1.2>>迭代器Iterator使用

|-------------|---------------------------|
| iterator的使用 | 接口说明 |
| begin+end | 获取第一个数据的位置,获取最后一个数据的下一个位置 |
| rbegin+rend | 获取最后一个数据的位置,获取第一个数据前一个位置 |

1.3>>vector空间

|----------|-------------------|
| 容量空间 | 接口说明 |
| size | 获取数据个数 |
| capacity | 获取容量大小 |
| empty | 判断是否为空 |
| resize | 改变vector的size |
| reserve | 改变vector的capacity |

1.4>>vector增删改查

|--------------|------------------|
| vector增删改查 | 接口说明 |
| push_back | 尾插 |
| pop_back | 尾删 |
| find | 查找(c++算法库) |
| insert | 在position之前插入val |
| erase | 删除position位置的数据 |
| swap | 交换两个vector的数据空间 |
| operator[] | 像数组一样访问 |

2>>部分模拟实现

2.1>>Test.cpp

cpp 复制代码
#include"vector.h"

int main()
{
	wc::vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);

	for (const auto& e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	for (size_t i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;

	return 0;
}

2.2>>Vector.h

cpp 复制代码
#pragma once
#include<assert.h>
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<list>
#include<string>
#include<algorithm>

using namespace std;
namespace wc 
{
	template<class T>//建立一个类模板
	class vector {
	public:
		typedef T* iterator;
		iterator begin() {//手动构建迭代器的开始
			return _start;
		}
		iterator end() {//手动构建迭代器的结束
			return _finish;
		}

		vector()//构造函数
			:_start(nullptr)//全部赋值为空指针
			, _finish(nullptr)
			, _end_of_storage(nullptr)
		{}

		~vector()//析构函数
		{
			delete[] _start;
			_start = _finish = _end_of_storage = nullptr;
		}

		size_t size() const//vector没有size,自己构造
		{
			return _finish - _start;
		}

		size_t capacity() const//vector没有capacity,自己构造
		{
			return _end_of_storage - _start;
		}

		void reserve(size_t n) {
			if (n > capacity()) {
				size_t oldSize = size();//之前的size
				T* tmp = new T[n];
				memcpy(tmp, _start, sizeof(T) * oldSize);
				delete[] _start;

				_start = tmp;
				_finish = _start + oldSize;//如果这里写size(),就会产生错误,因为_start值已经改变
				_end_of_storage = _start + n;
			}
		}

		T& operator[](size_t i) {
			assert(i < size());
			return _start[i];
		}

		void push_back(const T& x) {
			if (_finish == _end_of_storage) {
				reserve(capacity() == 0 ? 4 : capacity() * 2);
			}
			*_finish = x;
			_finish++;
		}
	private:
		iterator _start;
		iterator _finish;
		iterator _end_of_storage;
	};
}

3>>结语

今日C++到这里就结束啦,如果觉得文章还不错的话,可以三连支持一下。感兴趣的宝子们欢迎持续订阅小枫,小枫在这里谢谢宝子们啦~小枫の主页还有更多生动有趣的文章,欢迎宝子们去点评鸭~C++的学习很陡,时而巨难时而巨简单,希望宝子们和小枫一起坚持下去~你们的三连就是小枫的动力,感谢支持~

相关推荐
秋难降13 小时前
Python 知识 “八股”:给有 C 和 Java 基础的你😁😁😁
java·python·c
不知所云,13 小时前
3. lvgl 9.3 vscode 模拟环境搭建 lv_port_pc_vscode-release-v9.3
ide·vscode·编辑器·c·sdl·lvgl vscode·lvgl模拟器
small_wh1te_coder2 天前
硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
linux·c语言·汇编·嵌入式硬件·算法·c
hie988944 天前
C语言中的输入输出函数:构建程序交互的基石
c
布多5 天前
内存对齐:程序员必知的性能优化秘籍
性能优化·c
鑫宇吖17 天前
【工具使用-VScode】VScode如何设置空格和tab键显示
vscode·c
GodKK老神灭20 天前
STM32 实现PID
stm32·单片机·算法·c
莱茵不哈哈21 天前
操作系统八股文
c++·操作系统·c·八股文·进程线程
向上的车轮23 天前
语言特性适用的场景:卫星、火箭控制系统用什么开发语言?
java·开发语言·c++·c#·c·ada
Once_day24 天前
代码训练LeetCode(34)文本左右对齐
算法·leetcode·c