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 数据库地址表结构和数 ...
随机推荐
- TFS环境搭建
这篇文章主要介绍了微软源代码管理工具TFS2013安装与使用图文教程,本文详细的给出了TFS2013的安装配置过程.使用教程,需要的朋友可以参考下 最近公司新开发一个项目要用微软的TFS2013进行项 ...
- 天草(初级+中级+高级)VIP和黑鹰VIP破解教程(全部iso下载地址)
以下就是我收集的教程地址,之前我收集到的都是一课一课下载的,虽然这样,我也下载完了天草的全部课程.这里分享的是在一起的iso文件,比起一课课下载爽多了.~~ 还有这些教程都是从零起点开始教的,不用担心 ...
- Cloud Test 在手,宕机时让您不再措手不及
1月28日,Github 上午 10:04 分宕机了,导致全球各地的用户不能访问.官方回复可能是网络中断引起的,到 10:28 分已经可以正常访问. 对于互联网公司来说,一旦宕机就会措手不及,如何才能 ...
- 算法练习之:Biorhythms
Biorhythms Time Limit: 1000MS Memory Limit: 10000KB Problem Description Some people believe that th ...
- 一个简单的DDraw应用程序
阅读排行榜 1. C/C++ 笔试.面试题目大汇总(72915) 2. [STL]list基础(21718) 3. COM笔记-CoCreateInstance(14842) 4. C/C++ ...
- CRC算法及C实现
一.CRC算法原理 CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校 验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数 ...
- linux 下 poll 编程
poll 与 select 很类似,都是对描述符进行遍历,查看是否有描述符就绪.如果有就返回就绪文件描述符的个数将.poll 函数如下: #include <poll.h> int pol ...
- JAVA 数组常用技巧
1. 在Java中输出一个数组(Print an array in Java) int[] intArray = { 1, 2, 3, 4, 5 }; String intArrayString = ...
- Can't initialize OCI. Error -1
今天使用Toad连接Oracle时出现"Can't initialize OCI. Error -1" 解决方法 因为是刚做的windows 7系统,所以没有设置更改通知的时间 把 ...
- HDOJ/HDU 1372 Knight Moves(经典BFS)
Problem Description A friend of you is doing research on the Traveling Knight Problem (TKP) where yo ...