简化版vector

2024-03-30 20:18
文章标签 vector 简化版

本文主要是介绍简化版vector,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考书上敲了一个简化版的vector,这里的简化主要是指没有用模板去实现vector,而仅以基于string的vector这个范例来演示其内部的内存分配原理:

实现的功能有以下几点:

  1. 实现了预先保留空间,其内存分配策略为扩大两倍容量。
  2. 基于allocator实现了申请内存和初始化对象的分离。
  3. 使用move函数实现string的移动构造。

待实现的功能:

  1. 模板技术
  2. 引用计数
  3. 内部其他方法

代码如下:

#include <iostream>
#include <vector>
#include <allocators>
#include <string>class MyVector {
public:MyVector():first(nullptr),first_free(nullptr),last(nullptr){}MyVector(const MyVector&v) {pair<string*, string*> pir = alloc_copy(v.begin(), v.end());first = pir.first;first_free =last= pir.second;};MyVector &operator=(const MyVector&v) {free();auto data = alloc_copy(v.begin(), v.end());first = data.first;first_free = data.second;return *this;};~MyVector() { free(); };void push_back(const string& s) {check_alloc();alloc.construct(first_free++, s);};size_t size() const { return first_free - first; };size_t capacity() const { return last - first; };string *begin() const { return first; };string *end() const { return first_free; };
private:static allocator<string> alloc;//allocator<string> alloc;void check_alloc() {//检查容器是否已满if (size() == capacity())reallocate();}//拷贝构造一段pair<string*,string*> alloc_copy(string*begin, string*end) {auto data = alloc.allocate(end - begin);return make_pair(data, uninitialized_copy(begin, end, data));}//析构并释放所有内存void free() {//不能给deallocate传递空指针if (first) {for (auto p = first; p != first_free;) {alloc.destroy(p++);}alloc.deallocate(first, last - first);}};void reallocate() {//注意size为0的情况int new_alloc =  size()?capacity() * 2:1;string *data_start = alloc.allocate(new_alloc);string *temp_start = data_start;string *temp_first = first;for (size_t i = 0; i < size(); i++) {alloc.construct(temp_start++, move(*temp_first++));}free();first = data_start;first_free = temp_start;last = data_start + new_alloc;}string *first;string *first_free;string *last;
};

该类的私有属性:

string *first 是指向动态数组头部的指针

string *first_free 是指向动态数组已使用空间之后的第一个指针(即end)

string *last 是指向动态数组可使用空间之后的一个指针

这篇关于简化版vector的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/862475

相关文章

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

C++提高编程三(vector容器、deque容器)

文章目录 vector容器vector赋值操作vector容量和大小vector插入和删除vector数据存取vector互换容器vector预留空间deque容器构造函数deque赋值操作deque大小操作deque 插入和删除deque 数据存取deque 排序 vector容器 vector容器数据结构和数组相似,也称为单端数组。区别在于数组是静态空间,vector可以

STL-vector

string中拷贝构造的现代写法 string(const string& s):_str(nullptr){string tmp(s);swap(_str,tmp._str);} //s1=s3string& operator=(string s){swap(_str,s._str);return *this;} s(由s3调拷贝构造而来)是一个临时对象出了作用域要调析构函数。

容器第二课,List,ArrayList,LinkedList,Vector用法详解

package com.pkushutong.Collection;import java.util.ArrayList;import java.util.Date;import java.util.List;public class Test01 {public static void main(String[] args) {List list = new ArrayList<>();/*

Error: label vector and instance matrix must be double的解决方法

在使用uci下载的数据时,建模时出现这个错误的解决方法 首先现在UCI上面下载数据 然后右键另存为就行了。这样我们就从UCI里面下载到了训练数据 在matlab 点 导入数据,数据类型要记得选第二个, 如果选择最后一个table就会出现这个问题 最后附上代码 %%之前先import wine.date IMPORTED DATA 设为Numeric Matrix (数值矩

【C++】C++ STL探索:Vector使用与背后底层逻辑

C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现 在string类文章中提及了STL容器间的接口是大差不差的,本篇将直接通过模拟实现Vector来讲解底层实现与使用。 🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔

【C++】vector的简单模拟实现

目录 一、vector的基本实现机制: 二、vector的部分接口模拟实现: 1、构造与析构: 1、普通构造: 2、拷贝构造: 3、析构函数: 2、关于扩容: 1、reserve: 2、resize 3、增删查改: 1、在pos位置插入: 2、[]符号访问修改: 3、删除pos位置的值: 4、重载=运算符: 一、vector的基本实现机制: 如上所

STL—Vector详解

1.vector的介绍和使用  vector实际上是一个类模板,allocator (对象分配的元素的类型) 是第二个模板参数。 2.vector的使用 (1) vector的定义 int TestVector1(){// constructors used in the same order as described above:vector<int> first;

新手小白都能一步到位的vector

目录 前言 1.vector的介绍 2.vector的部分使用 2.1(constructor)构造函数声明 2.2vector的遍历(与string是相似的)  2.3 vector容量空间  2.4vector的增删查改 3.vector的嵌套 结束语 前言 前面我们学习C++的string部分,其中的接口,函数都很多,vector相较与string的学习就会

【C++】【日志贴】浅谈标准库类型string、vector及C风格字符串在全局和局部作用域中默认初始值情况

平时练习发现这个问题,记录一下。 C风格字符串在全局和局部作用域中初始值情况【空字符+未定义的字符】由于内存没有初始化造成的对于栈,内存如果没有初始化,则会出现“烫烫烫烫烫烫”;对于堆,内存如果没有初始化,则会出现“屯屯屯屯屯”;有时候数组没有结束符,输出数组也会有这些汉字的出现,就是因为没有结束符占用了后面的空闲的内存块即没有初始化的内存块 标准库类型string