#include<iostream>
#include<string>
#include<memory>
#include<utility>
using namespace std; class StrVec {
public:
StrVec():element(nullptr),first_free(nullptr),cap(nullptr){} // 默认构造函数
StrVec(const StrVec&); //拷贝构造函数
StrVec &operator=(const StrVec&); //赋值拷贝运算符
~StrVec(); void push_back(const string&); size_t size() const {
return first_free - element;
}
size_t capacity()const {
return cap - element;
}
string *begin() const {
return element;
}
string *end()const {
return first_free;
} private:
static allocator<string> alloc; void chk_n_alloc() {
if (size() == capacity())
reallocate();
}
pair<string*, string*> alloc_n_copy(const string*, const string*); // 用于被copy控制成员调用 void free();
void reallocate(); //获得另一块更大的内存(释放原有内存)并拷贝已有元素 (实现的是标准库vector的内存分配机制)
string *element; // 数组首地址
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 (element) {
for (auto p = first_free; p != element;)
alloc.destroy(--p);
alloc.deallocate(element, cap - element);
}
} StrVec::StrVec(const StrVec& s)
{
//调用alloc_n_copy分配空间以容纳与s中一样多的元素
auto newdate = alloc_n_copy(s.begin(), s.end());
element = newdate.first;
first_free = newdate.second;
} StrVec::~StrVec()
{
free();
} StrVec& StrVec::operator=(const StrVec& rhs)
{
auto data = alloc_n_copy(rhs.begin(), rhs.end());
free();
element = data.first;
first_free = cap = data.second;
return *this;
} //在一个新的,更大的string数组分配内存
//在内存空间的前一部分构造对象,保存现有元素
//销毁原内存中的元素,并释放这块内存
void StrVec::reallocate()
{
//分配当前大小两倍的内存空间
auto newCapacity = size() ? * size() : ;
auto newdata = alloc.allocate(newCapacity); auto dest = newdata; // 新内存首地址
auto elem = element; // 旧内存首地址 for (size_t i = ; i != size(); ++i)
alloc.construct(dest++, std::move(*elem++)); // 因为vector重新分配内存,会将原来的数据销毁,没必要拷贝,这里使用移动拷贝来提高效率
free();
element = newdata;
first_free = dest;
cap = element + newCapacity; }

vector实现(只能装入string)的更多相关文章

  1. Spring @ResponseBody只能返回String类型数据解决办法

    今天自己搭Spring MVC框架玩,使用AJAX调用Spring controller 并返回map对象,突然发现,哎,怎么@Response中只能返回String, 我用的Spring 3的版本也 ...

  2. C++ Primer : 第九章 : vector变长、string的其他操作以及容器适配器

    vector变长机制.string的其他构造方法,添加.替换和搜索操作,string比较和数值转换,最后是容器适配器. vector对象是如何增长的 vector和string类型提供了一些成员函数, ...

  3. Codevs 1205 单词反转(Vector以及如何输出string)

    题意:倒序输出句子中的单词 代码: #include<cstdio> #include<iostream> #include<string> #include< ...

  4. hibernate Hql 更新的参数只能设置String类型

    最近在项目中发现一个奇怪的现象,请看下面的代码 实体类MyEmployeeEntity @Table(name="myemployee") public class MyEmplo ...

  5. Java中常用的数据结构类

    结构体系图 List ArrayList.LinkedList.Vector有什么区别? ArrayList 只能装入引用对象(基本类型要转换为封装类): 线程不安全: 底层由数组实现(顺序表),因为 ...

  6. 20172302 《Java软件结构与数据结构》第二周学习总结

    2018年学习总结博客总目录:第一周 第二周 教材学习内容总结 第三章 集合概述-栈 3.1 集合 (1) 集合是一种聚集,组织了其他对象的对象.它定义一张破那个特定的方式,可以访问.管理所包含的对象 ...

  7. Java泛型概述

    泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理,以及让人苦恼的类型擦除. 泛型基础 泛型类 我们首先定义 ...

  8. Java泛型详解(转)

    文章转自  importNew:Java 泛型详解 引言 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理 ...

  9. Java基础__Java中集合类

    ArrayList:有序.可重复.线程不安全.内部使用数组进行存储 LinkedList:有序.可重复.线程不安全.内部使用引用进行存储[可以很方便的进行插入.删除数据] Vector:有序.可重复. ...

随机推荐

  1. 手动配置SVN服务

    现在理论上是不用手动添加,娘的一路下一步总是有问题,备份一个. 1 安装svnservice(是一个服务)    a 在Windows NT中本身包含了一个安装服务的工具"Service C ...

  2. 检索关键字 nyoj

    检索关键字 时间限制: 1000ms 内存限制: 65536KB 64位整型:      Java 类名: 上一题 提交 运行结果 统计 讨论版 下一题 类型: 没有   没有   难度        ...

  3. setsockopt IP_ADD_MEMBERSHIP error!No such device的解决方案

    /mnt # ./onvifserver Happytime onvif server version 2.6Onvif server running at 192.168.1.10:8000crea ...

  4. Oracle Supplemental 补全日志介绍

    转. Oracle补全日志(Supplemental logging)特性因其作用的不同可分为以下几种:最小(Minimal),支持所有字段(all),支持主键(primary key),支持唯一键( ...

  5. netty SimpleChannelInboundHandler<Message>和ChannelInboundHandlerApter

    一个兄弟的测试体验:https://blog.csdn.net/linuu/article/details/51307060 比较官方:https://www.imooc.com/article/28 ...

  6. js object对象赋值bug和对象复制clone方法

    最近在写程序的时候发现,如果新建一个object对象objb,初始化值为obja,如果改变了objb对象的字段值,那么obja也会随之改变,看来对象赋值传递的是一个引用. 代码重现: <scri ...

  7. ser2net的编译及测试

    1. 将ser2net编译进内核 1.1 make menuconfig 1.2 选上ser2net NetWork——>ser2net 2. 烧写固件 3.ser2net配置文件: 修改/et ...

  8. java 网络编程TCP

    客户端 服务端

  9. asp.net 网站 发布时 去掉.cs文件

    VS2013在WIN8下扁平的UI和我今天锈垢的大脑,让找这个设置找了好半天!!!   OK,言归正传.   在要发布的网站上右键,选择"发布网站".   在发布窗口中,会让你选择 ...

  10. bzoj2464 小明的游戏

    Description 小明最近喜欢玩一个游戏.给定一个n * m的棋盘,上面有两种格子#和@.游戏的规则很简单:给定一个起始位置和一个目标位置,小明每一步能向上,下,左,右四个方向移动一格.如果移动 ...