vector实现(只能装入string)
#include<iostream>
#include<string>
#include<memory>
#include<utility>
using namespace std; class StrVec {
public:
StrVec():element(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 - element;
}
size_t capacity()const {
return cap - element;
}
string *begin() const {
return element;
}
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*); // 用于被copy控制成员调用 void free();
void reallocate(); //获得另一块更大的内存(释放原有内存)并拷贝已有元素 (实现的是标准库vector的内存分配机制)
string *element; // 数组首地址
string *first_free;
string *cap; }; 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 (element) {
for (auto p = first_free; p != element;)
alloc.destroy(--p);
alloc.deallocate(element, cap - element);
}
} StrVec::StrVec(const StrVec& s)
{
//调用alloc_n_copy分配空间以容纳与s中一样多的元素
auto newdate = alloc_n_copy(s.begin(), s.end());
element = newdate.first;
first_free = newdate.second;
} StrVec::~StrVec()
{
free();
} StrVec& StrVec::operator=(const StrVec& rhs)
{
auto data = alloc_n_copy(rhs.begin(), rhs.end());
free();
element = data.first;
first_free = cap = data.second;
return *this;
} //在一个新的,更大的string数组分配内存
//在内存空间的前一部分构造对象,保存现有元素
//销毁原内存中的元素,并释放这块内存
void StrVec::reallocate()
{
//分配当前大小两倍的内存空间
auto newCapacity = size() ? * size() : ;
auto newdata = alloc.allocate(newCapacity); auto dest = newdata; // 新内存首地址
auto elem = element; // 旧内存首地址 for (size_t i = ; i != size(); ++i)
alloc.construct(dest++, std::move(*elem++)); // 因为vector重新分配内存,会将原来的数据销毁,没必要拷贝,这里使用移动拷贝来提高效率
free();
element = newdata;
first_free = dest;
cap = element + newCapacity; }
vector实现(只能装入string)的更多相关文章
- Spring @ResponseBody只能返回String类型数据解决办法
今天自己搭Spring MVC框架玩,使用AJAX调用Spring controller 并返回map对象,突然发现,哎,怎么@Response中只能返回String, 我用的Spring 3的版本也 ...
- C++ Primer : 第九章 : vector变长、string的其他操作以及容器适配器
vector变长机制.string的其他构造方法,添加.替换和搜索操作,string比较和数值转换,最后是容器适配器. vector对象是如何增长的 vector和string类型提供了一些成员函数, ...
- Codevs 1205 单词反转(Vector以及如何输出string)
题意:倒序输出句子中的单词 代码: #include<cstdio> #include<iostream> #include<string> #include< ...
- hibernate Hql 更新的参数只能设置String类型
最近在项目中发现一个奇怪的现象,请看下面的代码 实体类MyEmployeeEntity @Table(name="myemployee") public class MyEmplo ...
- Java中常用的数据结构类
结构体系图 List ArrayList.LinkedList.Vector有什么区别? ArrayList 只能装入引用对象(基本类型要转换为封装类): 线程不安全: 底层由数组实现(顺序表),因为 ...
- 20172302 《Java软件结构与数据结构》第二周学习总结
2018年学习总结博客总目录:第一周 第二周 教材学习内容总结 第三章 集合概述-栈 3.1 集合 (1) 集合是一种聚集,组织了其他对象的对象.它定义一张破那个特定的方式,可以访问.管理所包含的对象 ...
- Java泛型概述
泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理,以及让人苦恼的类型擦除. 泛型基础 泛型类 我们首先定义 ...
- Java泛型详解(转)
文章转自 importNew:Java 泛型详解 引言 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理 ...
- Java基础__Java中集合类
ArrayList:有序.可重复.线程不安全.内部使用数组进行存储 LinkedList:有序.可重复.线程不安全.内部使用引用进行存储[可以很方便的进行插入.删除数据] Vector:有序.可重复. ...
随机推荐
- 【Android界面实现】AppWidght全面学习之电量监控小部件的实现具体解释
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/bz419927089/article/details/35791047 前几天翻看之前下载的各种资料 ...
- jquery.ellipsis根据宽度(不是字数)进行内容截断,支持多行内容
jquery.ellipsis 自动计算内容宽度(不是字数)截断,并加上省略号,内容不受中英文或符号限制. 如果根据字数来计算的话,因为不同字符的宽度并不相同,比如l和W,特别是中英文,最终内容宽度会 ...
- jsfl读取xml,图片,并生成swf
var newdoc = fl.createDocument(); var doc = fl.getDocumentDOM(); var URI = fl.browseForFolderURL(&qu ...
- sqlserver2008设置定时任务
SQL2008 创建定时任务作业 1.打开[SQL Server Management Studio],在[对象资源管理器]列表中选择[SQL Server 代理]: --2.鼠标右击[SQL S ...
- hadoop集群安装配置详细教程
在上一篇的分享文章中我是给大家分享了运行部署hadoop的一些安装准备工作,这篇接上一篇继续为大家分享一些个人的学习经验总结.我学习用的是大快发行版DKHadoop,所以所有的经验分享都是以DKHad ...
- ORACLE11g 安装中xhost: unable to open display 问题解决纪实 (go)
http://blog.csdn.net/mchdba/article/details/62235761 1,Xhosts报错 安装好vncserver,本地pc笔记本能通过vnc viewer远程连 ...
- 使用axis2的wsdl2java把wsdl生成java文件
原文地址:http://blog.csdn.net/walkcode/article/details/7661674 有时在我们的开发中可能会有这种情况就是你要使用webservice但是对方没有给你 ...
- jsoncpp解析拼装数组
Cocos2d-x添加jsoncpp应该资料都有了,今天来讲讲数组的解析和拼装- int main() { 数组创建与分析: 例子一: string strValue = "{\" ...
- Mac网络连接问题
场景:同一个网络,其他电脑和手机可以访问远程网络端口为443的网站,如博客园,唯独我的电脑不能访问 解决方法:查看路由器的子网掩码和DNS地址,将IP设置为手动,输入ip.子网掩码和DNS即可
- centos 装iptraf查看网络流量
今天在测试服务器上准备看下网络流量 [root@localhost ~]# iptraf -d eth0-bash: iptraf: command not found 发现运维同事没有给安装 只能自 ...