13.39 编写自己的StrVec,包括自己版本的reserve、capacity和resize。

13.40 为StrVec添加一个构造函数,它接受一个initializer_list<string>参数

StrVec.h

#ifndef STRVEC_H
#define STRVEC_H
#include<iostream>
#include<string>
#include<utility>
#include<memory>
using namespace std;
class StrVec
{
public:
StrVec():elements(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-elements;}
size_t capacity() const { return cap-elements;}
string *begin() const { return elements;}
string *end() const { return first_free;} void reserve(size_t n);
void resize(size_t n,string s=string()); StrVec(initializer_list<string> il)
{
auto newcapacity=il.size();
auto newdata=alloc.allocate(newcapacity);
auto dest=newdata;
auto elem=il.begin();
while(elem!=il.end())
alloc.construct(dest++,*elem);
elements=newdata;
first_free=cap=dest;
}
private:
static allocator<string> alloc;
string *elements;
string *first_free;
string *cap;
void chk_n_alloc()
{
if(size()==capacity()) reallocate();
}
pair<string*,string*> alloc_n_copy(const string*,const string*);
void free();
void reallocate();
};
#endif // STRVEC_H

StrVec.cpp

#include"StrVec.h"

allocator<string> StrVec::alloc;
StrVec::StrVec(const StrVec &s)
{
auto newdata=alloc_n_copy(s.begin(),s.end());
elements=newdata.first;
first_free=newdata.second;
cap=newdata.second;
} StrVec& StrVec::operator=(const StrVec &s)
{
auto data=alloc_n_copy(s.begin(),s.end());
free();
elements=data.first;
first_free=cap=data.second;
return *this;
} StrVec::~StrVec()
{
free();
} 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_each(&first_free,&elements,[](string *p) { alloc.destroy(p);}); lambda式子
for(auto p=first_free;p!=elements;)
alloc.destroy(--p);
alloc.deallocate(elements,cap-elements);
}
} void StrVec::reallocate()
{
auto newcapacity=size()?*size():;
auto newdata=alloc.allocate(newcapacity);
auto dest=newdata;
auto elem=elements;
for(size_t i=;i!=size();++i)
alloc.construct(dest++,std::move(*elem++));
elements=newdata;
first_free=dest;
cap=elements+newcapacity;
} void StrVec::reserve(size_t n)
{
if(capacity()<n)
reallocate();
} void StrVec::resize(size_t n,string s)
{
if(size()<n)
push_back(s);
else if(size()>n)
{
for(auto p=elements+n;p!=first_free;)
alloc.destroy(p++);
first_free=elements+n;
}
}

allocator例子的更多相关文章

  1. new,delete和malloc,free以及allocator<T>

    一)new和delete,自己觉得一句话就是:最好同一作用域内,必须成对使用 先给出自己的认识: malloc,free,申请和释放一段heap堆中的内存. new:申请heap内存并在申请的内存中放 ...

  2. [转载] 彻底学习STL中的Allocator

    原文: http://cissco.iteye.com/blog/379093 帮助我们理解allocator的原理 Allocator是C++语言标准库中最神秘的部分之一.它们很少被显式使用,标准也 ...

  3. C++内存管理(超长,例子很详细,排版很好)

    [导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...

  4. c/c++ allocator 使用

    allocator 使用 作用:只开辟空间,不调用构造函数 操作一览表 allocator<T> a 定义一个名为a的allocator对象,它可以为类型为T的对象分配内存 a.alloc ...

  5. C++ allocator

    C++ allocator http://www.cnblogs.com/wpcockroach/archive/2012/05/10/2493564.html 说一说C++里的allocator.我 ...

  6. allocator class

    当分配一大块内存时,我们通常计划在这块内存上按需构造对象,这样的我们希望将内存分配和对象构造分离.但是通常的new关键字的分配的动态空间,有时候会造成一些浪费,更致命的是“如果一个类没有默认构造函数, ...

  7. 动态数组& allocator

    问题来源 在编写程序的时候,对数组."二维数组"的分配的删除掌握的不是很清楚,不能正确的进行定义初始化. 以及在使用vector的时候,如何正确的定义及初始化 注意!!! 尽量使用 ...

  8. 浅谈C++ allocator内存管理(对比new的局限性)(转)

    STL中,对内存管理的alloc的设计,迫使我去学习了allocator类.这里对allocator内存管理做了点笔记留给自己后续查阅.allocator类声明.定义于头文件<memory> ...

  9. SQLServer地址搜索性能优化例子

    这是一个很久以前的例子,现在在整理资料时无意发现,就拿出来再改写分享. 1.需求 1.1 基本需求: 根据输入的地址关键字,搜索出完整的地址路径,耗时要控制在几十毫秒内. 1.2 数据库地址表结构和数 ...

随机推荐

  1. 思考 Swift 中的 MirrorType 协议

    Swift中的反射非常有限,仅允许以只读方式访问元数据的类型子集.或许 Swift 因有严格的类型检验而不需要反射.编译时已知各种类型,便不再需要进行进一步检查或区分.然后大量的 Cocoa API ...

  2. 【codeforce 219D】 Choosing Capital for Treeland (树形DP)

    Choosing Capital for Treeland Description The country Treeland consists of n cities, some pairs of t ...

  3. 视频硬解api介绍

    在一个gpu如此强大的时代,视频解码怎么能少了gpu厂商的参加.为了用硬件加速视频解码,厂商定义了一些api. 好吧,一旦和硬件打交道,就会有os的参加,有了硬件与os参加,api肯定会变成很凌乱,看 ...

  4. SPRING IN ACTION 第4版笔记-第二章-004-Bean是否单例

    spring的bean默认是单例,加载容器是会被化,spring会拦截其他再次请求bean的操作,返回spring已经创建好的bean. It appears that the CompactDisc ...

  5. OA学习笔记-005-Spring2.5与struts2.1整合

    一.单独测试strust 1.action package cn.itcast.oa.test; import org.springframework.context.annotation.Scope ...

  6. 【log4js】

    手动创建日志目录 定时清理 nodejs之日志管理 玩转Nodejs日志管理log4js access.log-2015-11-20

  7. 【Node】fs

    var fs = require('fs') // fs 文件系统 var stdin = process.stdin var stdout = process.stdout var stats = ...

  8. 【转】Mac 下钥匙串不能授权访问怎么解决--不错

    原文网址:https://www.v2ex.com/t/240495 如题,之前都好好的,后来有次 xcode 打包 app 时弹出提示框要授权,我点击允许和始终允许都没反映,点拒绝就可以,刚才安装 ...

  9. Never use GetDate() when comparing date timesoffsets, use SYSDATETIMEOFFSET()

    -- my current uk time is 2014-01-09 10:43:00 +0 ) = '2014-01-09 18:43:00 +08:00'; ) = '2014-01-09 02 ...

  10. SQL SERVER 自定义函数 整数转成指定长度的16进制 转换成指定长度的16进制 不足补0

    最近做项目扩展的时候,遇到问题就是将整型转换成指定长度的16进制 刚开始就是直接使用 cast(12 as varbinary(4))但是发现这个不能解决我的问题 所以就上网搜了一下,然后改了改,下面 ...