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

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

StrVec.h

  1. #ifndef STRVEC_H
  2. #define STRVEC_H
  3. #include<iostream>
  4. #include<string>
  5. #include<utility>
  6. #include<memory>
  7. using namespace std;
  8. class StrVec
  9. {
  10. public:
  11. StrVec():elements(nullptr),first_free(nullptr),cap(nullptr){}
  12. StrVec(const StrVec&);
  13. StrVec& operator=(const StrVec&);
  14. ~StrVec();
  15. void push_back(const string&);
  16. size_t size() const { return first_free-elements;}
  17. size_t capacity() const { return cap-elements;}
  18. string *begin() const { return elements;}
  19. string *end() const { return first_free;}
  20.  
  21. void reserve(size_t n);
  22. void resize(size_t n,string s=string());
  23.  
  24. StrVec(initializer_list<string> il)
  25. {
  26. auto newcapacity=il.size();
  27. auto newdata=alloc.allocate(newcapacity);
  28. auto dest=newdata;
  29. auto elem=il.begin();
  30. while(elem!=il.end())
  31. alloc.construct(dest++,*elem);
  32. elements=newdata;
  33. first_free=cap=dest;
  34. }
  35. private:
  36. static allocator<string> alloc;
  37. string *elements;
  38. string *first_free;
  39. string *cap;
  40. void chk_n_alloc()
  41. {
  42. if(size()==capacity()) reallocate();
  43. }
  44. pair<string*,string*> alloc_n_copy(const string*,const string*);
  45. void free();
  46. void reallocate();
  47. };
  48. #endif // STRVEC_H

StrVec.cpp

  1. #include"StrVec.h"
  2.  
  3. allocator<string> StrVec::alloc;
  4. StrVec::StrVec(const StrVec &s)
  5. {
  6. auto newdata=alloc_n_copy(s.begin(),s.end());
  7. elements=newdata.first;
  8. first_free=newdata.second;
  9. cap=newdata.second;
  10. }
  11.  
  12. StrVec& StrVec::operator=(const StrVec &s)
  13. {
  14. auto data=alloc_n_copy(s.begin(),s.end());
  15. free();
  16. elements=data.first;
  17. first_free=cap=data.second;
  18. return *this;
  19. }
  20.  
  21. StrVec::~StrVec()
  22. {
  23. free();
  24. }
  25.  
  26. void StrVec::push_back(const string &s)
  27. {
  28. chk_n_alloc();
  29. alloc.construct(first_free++,s);
  30. }
  31.  
  32. pair<string*,string*> StrVec::alloc_n_copy(const string *b, const string *e)
  33. {
  34. auto data=alloc.allocate(e-b);
  35. return {data,uninitialized_copy(b,e,data)};
  36. }
  37.  
  38. void StrVec::free()
  39. {
  40. if(elements)
  41. {
         //for_each(&first_free,&elements,[](string *p) { alloc.destroy(p);}); lambda式子
  42. for(auto p=first_free;p!=elements;)
  43. alloc.destroy(--p);
  44. alloc.deallocate(elements,cap-elements);
  45. }
  46. }
  47.  
  48. void StrVec::reallocate()
  49. {
  50. auto newcapacity=size()?*size():;
  51. auto newdata=alloc.allocate(newcapacity);
  52. auto dest=newdata;
  53. auto elem=elements;
  54. for(size_t i=;i!=size();++i)
  55. alloc.construct(dest++,std::move(*elem++));
  56. elements=newdata;
  57. first_free=dest;
  58. cap=elements+newcapacity;
  59. }
  60.  
  61. void StrVec::reserve(size_t n)
  62. {
  63. if(capacity()<n)
  64. reallocate();
  65. }
  66.  
  67. void StrVec::resize(size_t n,string s)
  68. {
  69. if(size()<n)
  70. push_back(s);
  71. else if(size()>n)
  72. {
  73. for(auto p=elements+n;p!=first_free;)
  74. alloc.destroy(p++);
  75. first_free=elements+n;
  76. }
  77. }

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. TFS环境搭建

    这篇文章主要介绍了微软源代码管理工具TFS2013安装与使用图文教程,本文详细的给出了TFS2013的安装配置过程.使用教程,需要的朋友可以参考下 最近公司新开发一个项目要用微软的TFS2013进行项 ...

  2. 天草(初级+中级+高级)VIP和黑鹰VIP破解教程(全部iso下载地址)

    以下就是我收集的教程地址,之前我收集到的都是一课一课下载的,虽然这样,我也下载完了天草的全部课程.这里分享的是在一起的iso文件,比起一课课下载爽多了.~~ 还有这些教程都是从零起点开始教的,不用担心 ...

  3. Cloud Test 在手,宕机时让您不再措手不及

    1月28日,Github 上午 10:04 分宕机了,导致全球各地的用户不能访问.官方回复可能是网络中断引起的,到 10:28 分已经可以正常访问. 对于互联网公司来说,一旦宕机就会措手不及,如何才能 ...

  4. 算法练习之:Biorhythms

    Biorhythms Time Limit: 1000MS Memory Limit: 10000KB  Problem Description Some people believe that th ...

  5. 一个简单的DDraw应用程序

        阅读排行榜 1. C/C++ 笔试.面试题目大汇总(72915) 2. [STL]list基础(21718) 3. COM笔记-CoCreateInstance(14842) 4. C/C++ ...

  6. CRC算法及C实现

    一.CRC算法原理   CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校 验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数 ...

  7. linux 下 poll 编程

    poll 与 select 很类似,都是对描述符进行遍历,查看是否有描述符就绪.如果有就返回就绪文件描述符的个数将.poll 函数如下: #include <poll.h> int pol ...

  8. JAVA 数组常用技巧

    1.  在Java中输出一个数组(Print an array in Java) int[] intArray = { 1, 2, 3, 4, 5 }; String intArrayString = ...

  9. Can't initialize OCI. Error -1

    今天使用Toad连接Oracle时出现"Can't initialize OCI. Error -1" 解决方法 因为是刚做的windows 7系统,所以没有设置更改通知的时间 把 ...

  10. HDOJ/HDU 1372 Knight Moves(经典BFS)

    Problem Description A friend of you is doing research on the Traveling Knight Problem (TKP) where yo ...