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:有序.可重复. ...
随机推荐
- Effective C++:条款23:宁以non-member、non-friend替换member函数
(一) 有个class来表示网页浏览器: class WebBrowser { public: void clearChache(); void clearHistory(); void remove ...
- 廖雪峰 ---- Python教程
这是小白的Python新手教程,具有如下特点: 中文,免费,零起点,完整示例,基于最新的Python 3版本. Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学 ...
- js 各种循环遍历
js 各种循环遍历(表格比较) 遍历方法 能否遍历数组 能否遍历对象 备注 for 能 不能 for in 能(有诸多缺点) 能 为遍历对象而设计的,不适用于遍历数组 forEach 能 不能 bre ...
- MapReduce – 基本思路之推荐引擎
理解MapReduce关键两个步骤: 首先是构想出结构的数据结构,这种数据结构可以支撑你的业务分析使用:是要理解这种模式的处理元素. 第二步,分析原始数据的结构是怎样的: 第三步,基于原始数据结构以及 ...
- ERROR 1130 (HY000): Host '192.168.20.165' is not allowed to connect to this MySQL server
问题 远程连接mysql时遇到如下问题: ERROR 1130 (HY000): Host '192.168.20.165' is not allowed to connect to this MyS ...
- cc2530 AES加密
快速配置 Z-stack对Zigbee2006提供了全面的支持,功能之强大,性能稳定.安全性高,说到安全性是我们今天的主题.CC2430硬件支持128bit的AES加密算法,在协议栈中为了避开相同设备 ...
- 如何制作Jar包并在android中调用jar包
android制作jar包: 新建android工程,然后右击,点击导出,选择导出类型为Java下的JAR file,在java file specification 中不要选择androidmani ...
- FPGA该如何应对ASIC的大爆发?
有人认为,除了人才短缺.开发难度较大,相比未来的批量化量产的ASIC芯片,FPGA在成本.性能.功耗方面仍有很多不足.这是否意味着,在ASIC大爆发之际,FPGA将沦为其“过渡”品的命运? 安路科技市 ...
- Redis在Windows集群中的错误
创建集群: ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:70 ...
- 【Hibernate学习笔记-5.2】使用@Temporal修饰日期类型的属性
作者:ssslinppp 1. 摘要 关于日期类型,Java和数据库表示的方法不同: Java:只有java.util.Date和java.util.Calender两种: 数据库:dat ...