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

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

 #ifndef STRVEC_H
#define STRVEC_H #include<iostream>
#include<string>
#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 ;} private:
static allocator<string> alloc; // 分配元素
// 被添加的元素的函数使用
void chk_n_alloc()
{
if( size() == capacity() )
reallocate(); }
// 工具函数,被拷贝构造函数、赋值运算符和析构函数所使用
pair<string* ,string*> alloc_n_copy(const string* ,const string* ); void free();
void reallocate();
string* elements; // 指向数组首元素的指针
string* first_free; // 指向数组第一个空闲元素的指针
string* cap; // 指向数组尾后的指针 }; #endif

StrVec.cpp文件内容为:

 #include "StrVec.h"

 std::allocator<string> StrVec::alloc;

 void StrVec::push_back( const string& s )
{
chk_n_alloc(); // 确保有空间容纳新元素
// first_free指向的元素中构造s的副本
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 make_pair(data , uninitialized_copy(b,e,data) ); }
void StrVec::free()
{
// 不能传递给deallcoate一个空指针
if( elements)
{
for(auto p = first_free ; p != elements ; )
alloc.destroy(--p);
alloc.deallocate(elements,cap-elements) ;
} }
StrVec& StrVec::operator=( const StrVec& rhs )
{
auto data = alloc_n_copy(rhs.begin() , rhs.end() );
free() ;
elements = data.first ;
first_free= cap=data.second; return *this ; }
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++) );
free();
elements = newdata;
first_free = dest ;
cap = elements+ newcapacity ; }
StrVec::~StrVec()
{
free();
}

测试代码为maintest.cpp

 #include "StrVec.h"

 int main()
{
StrVec vec1;
vec1.push_back("ok1");
vec1.push_back("ok2"); auto begin = vec1.begin();
auto end= vec1.end(); while( begin != end )
{
cout<<*begin<<endl;
// cout<<endl;
begin++; } return ;
}

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. haproxy 2.0 dataplaneapi rest api 转为graphql docker 镜像

    为了方便直接使用haproxy dataplaneapi graphql 格式的查询,制作了一个简单的docker 镜像 基于dotenv 进行配置管理,可以直接通过环境变量传入参数,处理不同hapr ...

  2. linux mustache bash 实现mo 做为docker容器运行动态配置工具数组的处理

    前面有说过关于使用mo 工具的简单配置使用,但是实际中我们可能存在比较复杂的数据处理,比如数组,mo 可以进行数组的处理,但是在测试的过程中,一直失败,查看了官方的demo以及帮助命令发现可以通过参数 ...

  3. 字典树(Trie)学习笔记

    目录 什么是字典树 如何存储字典树 如何查找字符串有没有出现 第一个图的那种线段树 应用 例题 1.统计难题 2.P2580 于是他错误的点名开始了 什么是字典树 上图来自luogu题解 这是一种字典 ...

  4. GoCN每日新闻(2019-11-04)

    GoCN每日新闻(2019-11-04) GoCN每日新闻(2019-11-04)   1. Go中垃圾收集器是如何标记内存的 https://medium.com/a-journey-with-go ...

  5. Java Array二维数组使用

    二维数组:元素为一维数组的数组 package myArray.arrayarray; /* *二维数组:元素为一维数组的数组 * * 定义格式: * A:数组类型[][] 数组名: (推荐用法) * ...

  6. fluent在运行时改变重力方向方法总结

    Fluent版本:19.0(其他版本应该也适用) 这里我们用一个简单的算例(同心环中的自然对流)来说明 算例来自<ANSYS Fluid Dynamics Verification Manual ...

  7. yarn一些最佳配置

    合理设置队列名 mapreduce.job.queuename设置队列名map读取时进行小文件整合 mapreduce.input.fileinputformat.split.minsize mapr ...

  8. [Gamma阶段]第十次Scrum Meeting

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

  9. Bert 时代的创新(应用篇):Bert 在 NLP 各领域的

    Bert 时代的创新(应用篇):Bert 在 NLP 各领域的

  10. 用Python自动办公,做职场高手(完结)

    教程目录: ┣━07.S2 Word自动化处理,又快又好做文档┃  ┣━36 本章介绍┣━08.[Word]S2-1 轻松用Python快速生成Word文档┃  ┣━45.[真实案例]S2-1-3 批 ...