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 数据库地址表结构和数 ... 
随机推荐
- [BZOJ 2738] 矩阵乘法 【分块】
			题目链接:BZOJ - 2738 题目分析 题目名称 “矩阵乘法” 与题目内容没有任何关系..就像VFK的 A+B Problem 一样.. 题目大意是给定一个矩阵,有许多询问,每次询问一个子矩阵中的 ... 
- maven 根据不同的环境打war包-->资源文件的处理方式
			发现犯的错误: 1. 指定了testResource 文件夹与resource 为同一个文件夹.导致不论在resource 里面如何过滤文件,都不起作用.资源文件本来就是共享的.不必这样指定. 2. ... 
- 【bzoj 3299】 [USACO2011 Open]Corn Maze玉米迷宫(最短路)
			就一个最短路,并且边长都是1,所以每个点只搜一次. /************************************************************** Problem: 3 ... 
- Myeclipse2013 SVN安装方法以及项目上传到svn服务器
			1. 打开 Myeclipse 工具栏下的Help下的Install from Site 2.打开后弹出窗口, 并点击Add标签,如下图: 3.现在是最重要的一步,填写相关信息. 在对话框Name输入 ... 
- VS2012中使用纯C实现COM的小问题
			用VS2012新建C++工程都预定义了宏__cplusplus,所以引用到的都是C++的定义.但是要用C实现的话,一般都是也就不是C++的了.比如以下代码: #undef INTERFACE #def ... 
- JMS的作用
			JMS就是生产者与消费者模式.消费者负责消费生产者产生的消息.通过JMS可以做后台的异步操作,应用到具体工作中的话,有用它来发内部消息的.发邮件的.发短信的,做大操作时在后台做异步操作的. Java ... 
- CENTOS6.5 teamviewer安装
			官网https://www.teamviewer.com/en/download/linux.aspx下载此版本:RedHat, CentOS, Fedora, SUSE 
- BZOJ2293: 【POJ Challenge】吉他英雄
			2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 80 Solved: 59[Submit][Stat ... 
- NOI2005瑰丽华尔兹
			1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 893 Solved: 508[Submit][Status] ... 
- 开源(免费)三维 GIS(地形,游戏) 续1
			转自:http://www.cnblogs.com/xiexiaokui/archive/2009/04/02/1428525.html 转自 三维数字地球发布平台探索--几款开源软件介绍 http: ... 
