allocator例子
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例子的更多相关文章
- new,delete和malloc,free以及allocator<T>
一)new和delete,自己觉得一句话就是:最好同一作用域内,必须成对使用 先给出自己的认识: malloc,free,申请和释放一段heap堆中的内存. new:申请heap内存并在申请的内存中放 ...
- [转载] 彻底学习STL中的Allocator
原文: http://cissco.iteye.com/blog/379093 帮助我们理解allocator的原理 Allocator是C++语言标准库中最神秘的部分之一.它们很少被显式使用,标准也 ...
- C++内存管理(超长,例子很详细,排版很好)
[导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不 ...
- c/c++ allocator 使用
allocator 使用 作用:只开辟空间,不调用构造函数 操作一览表 allocator<T> a 定义一个名为a的allocator对象,它可以为类型为T的对象分配内存 a.alloc ...
- C++ allocator
C++ allocator http://www.cnblogs.com/wpcockroach/archive/2012/05/10/2493564.html 说一说C++里的allocator.我 ...
- allocator class
当分配一大块内存时,我们通常计划在这块内存上按需构造对象,这样的我们希望将内存分配和对象构造分离.但是通常的new关键字的分配的动态空间,有时候会造成一些浪费,更致命的是“如果一个类没有默认构造函数, ...
- 动态数组& allocator
问题来源 在编写程序的时候,对数组."二维数组"的分配的删除掌握的不是很清楚,不能正确的进行定义初始化. 以及在使用vector的时候,如何正确的定义及初始化 注意!!! 尽量使用 ...
- 浅谈C++ allocator内存管理(对比new的局限性)(转)
STL中,对内存管理的alloc的设计,迫使我去学习了allocator类.这里对allocator内存管理做了点笔记留给自己后续查阅.allocator类声明.定义于头文件<memory> ...
- SQLServer地址搜索性能优化例子
这是一个很久以前的例子,现在在整理资料时无意发现,就拿出来再改写分享. 1.需求 1.1 基本需求: 根据输入的地址关键字,搜索出完整的地址路径,耗时要控制在几十毫秒内. 1.2 数据库地址表结构和数 ...
随机推荐
- 思考 Swift 中的 MirrorType 协议
Swift中的反射非常有限,仅允许以只读方式访问元数据的类型子集.或许 Swift 因有严格的类型检验而不需要反射.编译时已知各种类型,便不再需要进行进一步检查或区分.然后大量的 Cocoa API ...
- 【codeforce 219D】 Choosing Capital for Treeland (树形DP)
Choosing Capital for Treeland Description The country Treeland consists of n cities, some pairs of t ...
- 视频硬解api介绍
在一个gpu如此强大的时代,视频解码怎么能少了gpu厂商的参加.为了用硬件加速视频解码,厂商定义了一些api. 好吧,一旦和硬件打交道,就会有os的参加,有了硬件与os参加,api肯定会变成很凌乱,看 ...
- SPRING IN ACTION 第4版笔记-第二章-004-Bean是否单例
spring的bean默认是单例,加载容器是会被化,spring会拦截其他再次请求bean的操作,返回spring已经创建好的bean. It appears that the CompactDisc ...
- OA学习笔记-005-Spring2.5与struts2.1整合
一.单独测试strust 1.action package cn.itcast.oa.test; import org.springframework.context.annotation.Scope ...
- 【log4js】
手动创建日志目录 定时清理 nodejs之日志管理 玩转Nodejs日志管理log4js access.log-2015-11-20
- 【Node】fs
var fs = require('fs') // fs 文件系统 var stdin = process.stdin var stdout = process.stdout var stats = ...
- 【转】Mac 下钥匙串不能授权访问怎么解决--不错
原文网址:https://www.v2ex.com/t/240495 如题,之前都好好的,后来有次 xcode 打包 app 时弹出提示框要授权,我点击允许和始终允许都没反映,点拒绝就可以,刚才安装 ...
- 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 ...
- SQL SERVER 自定义函数 整数转成指定长度的16进制 转换成指定长度的16进制 不足补0
最近做项目扩展的时候,遇到问题就是将整型转换成指定长度的16进制 刚开始就是直接使用 cast(12 as varbinary(4))但是发现这个不能解决我的问题 所以就上网搜了一下,然后改了改,下面 ...