简化版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

相关文章

力扣刷题 杨辉三角(使用c++ vector解法)

杨辉三角 题目描述示例1示例2提示:代码 题目描述 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例1 输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例2 输入: numRows = 1

C++STL 初阶(5)vector的简易实现(上)

不同于string只实现一个最简单的版本,vector在此处我们要实现的是模版类,类模版的声明和定义分离非常不方便(会在链接时报错),所以我们都只在一个vector.h下去实现声明和定义。后续我们提及到的库里面实现的vector也是只有.h,没有.cpp      不过库中会将短的函数放在类里,如size、begin等(直接作为inline函数),大的如insert_aux就会放在

C++ std::vector 的 emplace_back 能否完全取代 push_back

区别: push_back:先在调用处构造一次 class,传递进 push_back 内后再进行拷贝到缓冲区。 emplace_back:在内部直接将构造 class 的参数转发构造到缓冲区。   如果以上说法不好理解,那么用代码来表示。 // 该 Class 支持隐式构造class Class{public:Class(int a) : _a(a) {}int _a;};ve

vector对象在内存空间中是如何增长的

vector对象在内存空间中是如何增长的   我们都知道vector对象是动态存储的,从这一点看有点像链表,可以动态的增加或减少元素。我们也知道链表中是有指针变量,专门用于存储上一个和下一个元素的地址。正是因为这两个指针的存在,我们才能做到动态的存储数据,即不用像数组那样必须事先申请好空间。链表的缺点就是不能够快速的随机访问其中元素,必须通过指针层层查找。 但是,vector既可以实现动态存储数

STL vector容器自己实现

本文参考了侯捷的 《STL 源码分析》一书,出于兴趣,自行实现了简单的 vector 容器。 之后会陆续上传 list, deque 等容器的代码,若有错误,欢迎留言指出。 vector 容易实现的几点注意事项: 1. 由于vector 是动态数组。 出于效率的考虑,在往vector 中加入元素时,内存的扩展遵循的规则是:    1> 如果当前可用内存不够,开 2倍大的内存,将原来

STL源码分析之vector容器

vector与array非常相似,两者唯一差别在于空间运用的灵活性          array是静态空间,一旦配置了就不能改变;若要改变使用的空间大小,一切琐碎由客户端自己来处理:先配置新空间,然后将元素从旧址一一搬到新址去,在退还原来的空间          vector则是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新的元素   以下为sgi vector源码:

Java中Vector、ArrayList、LinkedList的区别

List能够用于存放多个元素,维护元素的次序(按元素进入的顺序保存对象),并且允许元素重复(虽然List和Set都是继承自Collection接口,但在这一点有区别,Set不允许有重复的元素)。 在Java中List接口有三个实现类,分别是ArrayList、Vector和LinkedList。3个具体实现类的区别如下: ArrayList:最常用的List实现类,基于动态数组的数据结构。具有

C++嵌套vector(二维矩阵)的初始化

初始化一个嵌套的char型嵌套vector,已知C++11允许vector用花括号{}的初始方式,vector元素以逗号隔开,例如: vector<char>> board = {'X', 'X', 'X'}; 推广之,易知嵌套vector就是内层vector作为外层vector的元素,初始化用两层花括号,第一层花括号之间用逗号隔开: vector<vector<char>> board =

阿里笔试--智能对话简化版之query指令槽位识别

头天贴主参加了阿里的笔试,第一道编程题就够做了。不是时间短,是脑子不够用。好了,不废话了,上干货。 题目介绍 现下互联网AI战争以智能音箱为切入口,敲开市场大门,抢夺市场用户。智能音箱需要语音交互,这就涉及到query指令的语义理解。例如:"我要看章子怡的一代宗师",这里边需要识别出来:动作“看”,“章子怡”,“一代宗师”。一般都会建立一个知识库:名词标注各种标签,这里边可能会有:章子怡是演员

android imageview setImageResource vector xml ANR 怎么解决

在Android开发中,使用 ImageView 设置矢量图资源(vector XML)时,可能会遇到ANR(应用无响应)的情况。这个问题通常是因为矢量图的解析和绘制可能需要较多的时间,特别是对于复杂的矢量图。 以下是一些解决ANR问题的方法: 1. 使用 AppCompatImageView 确保你使用的是 AppCompatImageView 而不是普通的 ImageView。AppCo