C++ //练习 13.40 为你的StrVec类添加一个构造函数,它接受一个Initializer_list<string>参数。

ops/2024/12/23 1:29:53/

C++ Primer(第5版) 练习 13.40

liststring_1">练习 13.40 为你的StrVec类添加一个构造函数,它接受一个Initializer_list参数。

环境:Linux Ubuntu(云服务器)
工具:vim

 

代码块
/*************************************************************************> File Name: ex13.39.cpp> Author: > Mail: > Created Time: Fri 26 Apr 2024 08:38:31 AM CST************************************************************************/#include<iostream>
#include<memory>
#include<utility>
#include<initializer_list>
using namespace std;class StrVec{public:StrVec(): elements(nullptr), first_free(nullptr), cap(nullptr) {}StrVec(const StrVec &);StrVec(initializer_list<string>li);StrVec &operator= (const StrVec &);~StrVec();void push_back(const string &);size_t size() const { return first_free - elements; } size_t capacity() const { return cap - elements; }string *begin() const { return elements; }string *end() const { return first_free; }void reserve(size_t s);void resize(size_t s);private:Static allocator<string> alloc;void chk_n_alloc(){ if (size() == capacity()) reallocate(); }pair<string*, string*>alloc_n_copy(const string*, const string*);void free();void reallocate();string *elements;string *first_free;string *cap;
};void StrVec::push_back(const string &s){chk_n_alloc();alloc.construct(first_free++, s);
}pair<string*, string*>StrVec::alloc_n_copy(const string *b, const string *e){auto data = alloc.allocate(e - b);return {data, uninitialized_copy(b, e, data)};
}void StrVec:free(){if(elements){for(auto p = first_free; p != elements; ){alloc.destroy(--p);}alloc.deallocate(elements, cap - elements);}
}StrVec::StrVec(const StrVec &s){auto newdata = alloc_n_copy(s.begin(), s.end());elements = newdata.first;first_free = cap = newdata.second;
}StrVec::~StrVec() { free(); }StrVec &StrVec::operator= (const StrVec &rhs){auto data = alloc_n_copy(rhs.begin(), rhs.end());free();elements = data.first;first_free = cap = data.second;return *this;
}void StrVec::reallocate(){auto newcapacity = size() ? 2 * size() : 1;auto newdata = alloc.allocate(newcapacity);auto dest = newdata;auto elem = elements;for(size_t i = 0; i != size(); ++i){alloc.construct(dest++, move(*elem++));}free();elements = newdata;first_free = dest;cap = elements + newcapacity;
}void StrVec::reserve(size_t s){if(s <= size()){return;}auto newElem = alloc.allocate(s);auto dest = newElem;auto elem = elements;for(size_t i = 0; i != size(); ++i){alloc.construct(dest++, move(*elem++));}free();elements = newElem;cap = newElem + s;first_free = dest;
}void StrVec::resize(size_t s){if(s > capacity()){return ;}if(s < size()){auto newFisrt = first_free;for(size_t i = 0; i != size() - s; ++i){alloc.destroy(--newFirst);}fisrt_free = newFirst;return ;}else if(s == size()){return ;}else{auto newFirst = first_free;for(size_t i = 0; i != s - size(); ++i){alloc.construct(newFirst++, "");}first_free = newFirst;return ;}
}

http://www.ppmy.cn/ops/19216.html

相关文章

【STM32+HAL+Proteus】系列学习教程4---GPIO输入模式(独立按键)

实现目标 1、掌握GPIO 输入模式控制 2、学会STM32CubeMX配置GPIO的输入模式 3、具体目标&#xff1a;1、按键K1按下&#xff0c;LED1点亮&#xff1b;2、按键K2按下&#xff0c;LED1熄灭&#xff1b;2、按键K3按下&#xff0c;LED2状态取反&#xff1b; 一、STM32 GPIO 输入…

Arco design 发布到生成环境F5刷新报错404

问题&#xff1a;开发环境没问题&#xff0c;生成环境正常跳转也没问题但是F5刷新报错 解决办法一&#xff1a;修改 history: createWebHistory(), 改为history: createWebHashHistory(),

Java设计模式 _创建型模式_建造者模式(Builder)

一、建造者模式 1、建造者模式&#xff08;Builder Pattern&#xff09;是一种创建对象的设计模式。它允许你使用不同的构建策略来创建复杂对象。通常是在复杂类中通过静态内部类&#xff08;Builder&#xff09;来进行构建。 2、实现思路&#xff1a; &#xff08;1&#xf…

8086:qemu执行汇编

正文 环境&#xff1a;macOS M1。 QEMU&#xff08;Quick EMUlator&#xff09;是一个开源的虚拟机监视器&#xff0c;可以模拟多种硬件平台&#xff0c;包括处理器架构、设备和操作系统。QEMU具有以下主要功能和用途&#xff1a; 硬件模拟器&#xff1a;QEMU可以模拟多种处理…

PDF 书签制作与调整 从可编辑、不可编辑 PDF 文档创建书签的方法

本文是对以前发表的旧文拆分&#xff0c;因为原文主题太多&#xff0c;过长&#xff0c;特另起一篇分述。 第一部分 由可编辑 PDF 文档创建书签 方法 1. Adobe Acrobat Pro autobookmark AutoBookmark 是一个可用于 Adobe Acrobat 自动生成书签的插件。 官方下载地址&…

机器学习-线性回归普通最小二乘法运用的经典基本假设有哪些?

在线性回归中&#xff0c;普通最小二乘法&#xff08;Ordinary Least Squares&#xff0c;OLS&#xff09;是一种常用的参数估计方法。它基于一些经典的基本假设&#xff0c;包括以下几个方面&#xff1a; 线性关系&#xff1a;OLS假设因变量&#xff08;被解释变量&#xff0…

Docker基础学习(5.Docker镜像命令)

⭐ 作者简介&#xff1a;码上言 ⭐ 代表教程&#xff1a;Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容&#xff1a;个人博客系统 ⭐我的文档网站&#xff1a;http://xyhwh-nav.cn/ ⭐微信公众号&#xff1a;码上言 文章目录 Docker run流程镜像是什么&a…

ISP比普通的静态代理相比有什么优势?

ISP&#xff08;Internet Service Provider&#xff09;&#xff0c;即互联网服务提供商&#xff0c;是向广大用户综合提供互联网接入业务、信息业务、增值业务的电信运营商。而静态代理则是一个固定不变的代理IP地址&#xff0c;具有稳定性强、兼容性好和管理方便等特点。当我…