C++中STL中简单的Vector的实现
该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的实现的更多相关文章
- c++中STL中的next_permutation函数基本用法
对于next_permutation函数是针对于排列组合问题的库函数,它的排序方式是按照字典的方式排列的·: 如以下代码对于next_permutation函数的初步解释: #include<c ...
- C++的STL中vector内存分配方法的简单探索
STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux CentOS 5.2 1.代码 #include <vector> #include <stdio ...
- C++ STL中vector(向量容器)使用简单介绍
原文:http://www.seacha.com/article.php/knowledge/cbase/2013/0903/2205.html C++ vector(向量容器)是一个线性顺序结构.相 ...
- C++STL中的vector的简单实用
[原创] 使用C++STL中的vector, #include <stdio.h> #include<stdlib.h> #include<vector> usin ...
- DLL中传递STL参数(如Vector或者list等)会遇到的问题[转载]
最近的一个项目中遇到了调用别人的sdk接口(dll库)而传给我的是一个vector指针,用完之后还要我来删除的情况.这个过程中首先就是在我的exe中将其vector指针转为相应指针再获取vector中 ...
- STL中vector的赋值,遍历,查找,删除,自定义排序——sort,push_back,find,erase
今天学习网络编程,那个程序中利用了STL中的sort,push_back,erase,自己没有接触过,今天学习一下,写了一个简单的学习程序.编译环境是VC6.0 这个程序使用了vect ...
- STL中vector、list、deque和map的区别
1 vector 向量 相当于一个数组 在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capac ...
- 【转】STL中vector、list、deque和map的区别
1.vector 向量 相当于一个数组 在内存中分配一块连续的内容空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数 ...
- STL中的Vector相关用法
STL中的Vector相关用法 标准库vector类型使用需要的头文件:#include <vector>. vector 是一个类模板,不是一种数据类型,vector<int> ...
随机推荐
- Cronicle 基于nodejs 的分布式任务调度工具
Cronicle 是一款不多的分布式任务调度工具,基于nodejs 开发,同时包含看web UI,从官方介绍看到的UI还是 挺不错的,而且功能很丰富,值得试用下 参考资料 http://cronicl ...
- HNOI2015总结
// 此博文为迁移而来,写于2015年4月21日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vy9t.html 这次省 ...
- 同余方程组(EXCRT)(luogu4777)
#include<cstdio> #include<algorithm> #define ll long long using namespace std; ll k; ll ...
- JavaScript代码笔记重点:
JavaScript的基本特点:JavaScript是基本对象和事件驱动,具有实时性,动态性,跨平台性和安全性等. JavaScript是对大小写敏感的. <!DOCTYPE html> ...
- ssl 原理简介
要想弄明白SSL认证原理,首先要对CA有有所了解,它在SSL认证过程中有非常重要的作用.说白了,CA就是一个组织,专门为网络服务器颁发证书的,国际知名的CA机构有VeriSign.Symantec,国 ...
- shell 换行与不换行
test.sh: echo -e "hello w\norld!"echo -e "hello w\c"echo "orld!" 输出 bo ...
- SpringCloud:搭建基于Gateway的微服务网关(一)
1.需求 最近在尝试着写一个开放平台,于是先搭建网关. 作用:统一的请求入口,完成对请求的跟踪,限流(未做),鉴权,分发,封装响应 2.工作原理 2.1.请求 在开放平台中申请对接口的使用,申请通过后 ...
- 【CSP膜你赛】ATM
题目描述 小沈阳在小品里说过:“人生最痛苦的事情是人死了,钱还没花掉”. 于是小宋(80 岁)决定要将所有的储蓄从 ATM 机中取出花光. 小宋忘记 了她有多少存款(银行卡密码她是记得的 2333), ...
- 【BIEE】导出大量数据报错处理请求时出现致命错误。服务器响应为 com.siebel.analytics.utils.InputStreamWithLimit$ReadOverTheLimitException
问题描述 在使用BIEE导出大量数据的时候,报错如下: 处理请求时出现致命错误.服务器响应为: com.siebel.analytics.utils.InputStreamWithLimit$Read ...
- OpenFOAM——在钝板上分离的层流
本算例来自<ANSYS Fluid Dynamics Verification Manual>中的VMFL063: Separated Laminar Flow Over a Blunt ...