该vector只能容纳标准库中string类,

直接上代码了,StrVec.h文件内容为:

  1. #ifndef STRVEC_H
  2. #define STRVEC_H
  3.  
  4. #include<iostream>
  5. #include<string>
  6. #include<memory>
  7. using namespace std;
  8. class StrVec{
  9. public:
  10. // 默认构造函数
  11. StrVec():elements(nullptr),first_free(nullptr),cap(nullptr)
  12. {
  13.  
  14. }
  15. //拷贝构造函数
  16. StrVec(const StrVec& );
  17. //拷贝赋值运算符
  18. StrVec& operator=(const StrVec&);
  19. ~StrVec();
  20. void push_back(const string&);
  21. size_t size() const { return first_free - elements ; }
  22. size_t capacity() const { return cap - elements ;}
  23. string* begin() const { return elements ;}
  24. string* end() const { return first_free ;}
  25.  
  26. private:
  27. static allocator<string> alloc; // 分配元素
  28. // 被添加的元素的函数使用
  29. void chk_n_alloc()
  30. {
  31. if( size() == capacity() )
  32. reallocate();
  33.  
  34. }
  35. // 工具函数,被拷贝构造函数、赋值运算符和析构函数所使用
  36. pair<string* ,string*> alloc_n_copy(const string* ,const string* );
  37.  
  38. void free();
  39. void reallocate();
  40. string* elements; // 指向数组首元素的指针
  41. string* first_free; // 指向数组第一个空闲元素的指针
  42. string* cap; // 指向数组尾后的指针
  43.  
  44. };
  45.  
  46. #endif

StrVec.cpp文件内容为:

  1. #include "StrVec.h"
  2.  
  3. std::allocator<string> StrVec::alloc;
  4.  
  5. void StrVec::push_back( const string& s )
  6. {
  7. chk_n_alloc(); // 确保有空间容纳新元素
  8. // first_free指向的元素中构造s的副本
  9. alloc.construct(first_free++,s) ;
  10.  
  11. }
  12. pair<string* ,string* > StrVec::alloc_n_copy(const string* b, const string* e )
  13. {
  14. auto data = alloc.allocate(e-b);
  15. return make_pair(data , uninitialized_copy(b,e,data) );
  16.  
  17. }
  18. void StrVec::free()
  19. {
  20. // 不能传递给deallcoate一个空指针
  21. if( elements)
  22. {
  23. for(auto p = first_free ; p != elements ; )
  24. alloc.destroy(--p);
  25. alloc.deallocate(elements,cap-elements) ;
  26. }
  27.  
  28. }
  29. StrVec& StrVec::operator=( const StrVec& rhs )
  30. {
  31. auto data = alloc_n_copy(rhs.begin() , rhs.end() );
  32. free() ;
  33. elements = data.first ;
  34. first_free= cap=data.second;
  35.  
  36. return *this ;
  37.  
  38. }
  39. void StrVec::reallocate()
  40. {
  41. // 我们将分配当前大小两倍的内存空间;
  42. auto newcapacity = size() ? *size() : ;
  43. //分配新内存
  44. auto newdata = alloc.allocate( newcapacity ) ;
  45.  
  46. auto dest=newdata ;
  47. auto elem = elements ;
  48. for(size_t i=; i != size() ; i++)
  49. alloc.construct(dest++,std::move( *elem++) );
  50. free();
  51. elements = newdata;
  52. first_free = dest ;
  53. cap = elements+ newcapacity ;
  54.  
  55. }
  56. StrVec::~StrVec()
  57. {
  58. free();
  59. }
  60.  

测试代码为maintest.cpp

  1. #include "StrVec.h"
  2.  
  3. int main()
  4. {
  5. StrVec vec1;
  6. vec1.push_back("ok1");
  7. vec1.push_back("ok2");
  8.  
  9. auto begin = vec1.begin();
  10. auto end= vec1.end();
  11.  
  12. while( begin != end )
  13. {
  14. cout<<*begin<<endl;
  15. // cout<<endl;
  16. begin++;
  17.  
  18. }
  19.  
  20. return ;
  21. }

C++中STL中简单的Vector的实现的更多相关文章

  1. c++中STL中的next_permutation函数基本用法

    对于next_permutation函数是针对于排列组合问题的库函数,它的排序方式是按照字典的方式排列的·: 如以下代码对于next_permutation函数的初步解释: #include<c ...

  2. C++的STL中vector内存分配方法的简单探索

    STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux  CentOS 5.2 1.代码 #include <vector> #include <stdio ...

  3. C++ STL中vector(向量容器)使用简单介绍

    原文:http://www.seacha.com/article.php/knowledge/cbase/2013/0903/2205.html C++ vector(向量容器)是一个线性顺序结构.相 ...

  4. C++STL中的vector的简单实用

    [原创] 使用C++STL中的vector, #include <stdio.h> #include<stdlib.h> #include<vector> usin ...

  5. DLL中传递STL参数(如Vector或者list等)会遇到的问题[转载]

    最近的一个项目中遇到了调用别人的sdk接口(dll库)而传给我的是一个vector指针,用完之后还要我来删除的情况.这个过程中首先就是在我的exe中将其vector指针转为相应指针再获取vector中 ...

  6. STL中vector的赋值,遍历,查找,删除,自定义排序——sort,push_back,find,erase

    今天学习网络编程,那个程序中利用了STL中的sort,push_back,erase,自己没有接触过,今天学习一下,写了一个简单的学习程序.编译环境是VC6.0         这个程序使用了vect ...

  7. STL中vector、list、deque和map的区别

    1 vector     向量 相当于一个数组    在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capac ...

  8. 【转】STL中vector、list、deque和map的区别

    1.vector 向量 相当于一个数组 在内存中分配一块连续的内容空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数 ...

  9. STL中的Vector相关用法

    STL中的Vector相关用法 标准库vector类型使用需要的头文件:#include <vector>. vector 是一个类模板,不是一种数据类型,vector<int> ...

随机推荐

  1. 读RAM时的时序风险

    读RAM时的时序有两个风险:1.数据已经存储好,读所需的时间.2.数据同时更新,读所需的时间节点.对于前者,只要延时足够节拍就行.对于后者,还必须要考虑数据建立的时间,同样延时的准备可能会因为数据尚未 ...

  2. About me recently

    About me recently Recently I fell that memory has always been problematic.Maybe I hava bee too tired ...

  3. x64汇编第一讲,Vs系列配置x64环境与x86环境

    目录 x64汇编环境配置 一丶x64环境配置 1.1 VS系列编译器配置X64Asm开发环境. 二丶Vs配置X86汇编环境. x64汇编环境配置 一丶x64环境配置 现在windows系统都是64位了 ...

  4. 帝国cms替换iwms幻灯图片问题

    在管理标签模板中增加一个新模板 页面模板内容为:[!--empirenews.listtemp--]<!--list.var1-->[!--empirenews.listtemp--] 列 ...

  5. python 操作es

    Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上. Lucene 可能是目前存在的,不论开源还是私有的,拥有最先进,高性能和全功能搜索 ...

  6. cloneable以及深拷贝和浅拷贝

    Objec类有11个方法,有两个protected的方法,其中一个为clone方法(另一个为finalize). 该方法的签名是: protected native Object clone() th ...

  7. [Gamma阶段]第四次Scrum Meeting

    Scrum Meeting博客目录 [Gamma阶段]第四次Scrum Meeting 基本信息 名称 时间 地点 时长 第四次Scrum Meeting 19/05/30 大运村寝室6楼 35min ...

  8. DNS技术和NAT技术详解

    DNS技术和NAT技术详解一.DNS(Domain Name System)1.什么是DNS2. 了解域名3.域名解析过程4.使用dig工具分析DNS过程5.浏览器输入URL后发生什么事?二.ICMP ...

  9. answer

    https://www.cnblogs.com/549294286/p/10451394.html 基于BIO实现的Server端,当建立了100个连接时,会有多少个线程?如果基于NIO,又会是多少个 ...

  10. 深入SaltStack

    [译者注] 这是一篇发表在opencredo官网的博文,通过比较流行的Puppet和新发展起来的Salt,详细地介绍了Salt的功能.在征得原作者的同意后,翻译出来,与大家分享.初次翻译长文,请大家指 ...