StrBlob是一个管理string的类,借助标准库容器vector,以及动态内存管理类shared_ptr,我们将vector保存在动态内存里,这样就能在多个对象之间共享内存。

定义StrBlob类:

#include <iostream>
#include <stdexcept>
#include <memory>
#include <vector>
#include <string>
#include <initializer_list>
#include <utility>
#include <stdexcept> // for out_of_range class StrBlob
{
public:
typedef std::vector<std::string>::size_type size_type;
typedef std::shared_ptr<std::vector<std::string>> shdptrStrVec; StrBlob();
StrBlob(std::initializer_list<std::string> il);
StrBlob(std::vector<std::string>::iterator& left, std::vector<std::string>::iterator& right);
StrBlob(std::vector<std::string>& vec); size_type size() const { return data->size(); }
bool empty() const { return data->empty();} void push_back(const std::string& str ){ data->push_back(str);}
void pop_back(); // 访问元素
std::string& front();
std::string& back();
// const 版本
const std::string& front() const;
const std::string& back() const; std::string& at(size_type i){ return data->at(i); } StrBlob& operator = (StrBlob& blob); private: std::shared_ptr<std::vector<std::string>> data; void check(size_type i, const std::string& msg) const;
};

StrBlob的实现:

StrBlob::StrBlob() : data(std::make_shared<std::vector<std::string>>())
{
} StrBlob::StrBlob(std::initializer_list<std::string> il) : data(std::make_shared<std::vector<std::string>> (il))
{
} StrBlob::StrBlob(std::vector<std::string>::iterator& left, std::vector<std::string>::iterator& right) : data(std::make_shared<std::vector<std::string>>(left, right)){ } StrBlob::StrBlob(std::vector<std::string>& vec) : data(std::make_shared<std::vector<std::string>>(vec)) {
} void StrBlob::check(size_type i, const std::string& msg) const
{
if (i >= data->size())
throw std::out_of_range(msg);
} std::string& StrBlob::front()
{
check(0, "");
return data->front();
} std::string& StrBlob::back()
{
check(0, "");
return data->back();
} const std::string& StrBlob::front() const
{
check(0, "");
return data->front();
} const std::string& StrBlob::back() const
{
check(0, "");
return data->back();
} void StrBlob::pop_back()
{
check(0, "");
data->pop_back();
} StrBlob& StrBlob::operator =(StrBlob& blob) { this->data = blob.data; return *this;
}

C++ Primer : 第十二章 : 动态内存之shared_ptr类实例:StrBlob类的更多相关文章

  1. C++ Primer : 第十二章 : 动态内存之shared_ptr与new的结合使用、智能指针异常

    shared_ptr和new结合使用 一个shared_ptr默认初始化为一个空指针.我们也可以使用new返回的指针来初始化一个shared_ptr: shared_ptr<double> ...

  2. C++ Primer : 第十二章 : 动态内存之shared_ptr类

    在C++中,动态内存是的管理是通过一对运算符来完成的:new  ,在动态内存中为对象分配空间并返回一个指向该对象的指针,delete接受一个动态对象的指针,销毁该对象,并释放该对象关联的内存. 动态内 ...

  3. C++ Primer : 第十二章 : 动态内存之动态内存管理(new和delete)

    C++语言定义了两个运算符来分配和释放动态内存:运算符new分配内存,运算符delete释放new分配的内存. 运算符new和delete 使用new动态分配和初始化对象 在自由空间分配的内存是无名的 ...

  4. C++ Primer : 第十二章 : 动态内存之unique_ptr和weak_ptr

    unique_ptr 一个unique_ptr拥有它所管理的对象,与shared_ptr不同,unique_ptr指向的对象只能有一个用户.当unique_ptr被销毁后,它所指向的对象也被销毁. 定 ...

  5. C++ Primer : 第十二章 : 动态内存之动态数组

    动态数组的分配和释放 new和数组 C++语言和标准库提供了一次分配一个对象数组的方法,定义了另一种new表达式语法.我们需要在类型名后跟一对方括号,在其中指明要分配的对象的数目. int* arr ...

  6. C++ Primer : 第十二章 : 动态内存之allocator类

    标准库allocator类定义在头文件 <memory>中.它帮助我们将内存分配和构造分离开来,它分配的内存是原始的.未构造的. 类似vector,allocator也是一个模板类,我们在 ...

  7. C++ Primer 5th 第12章 动态内存

    练习12.1:在此代码的结尾,b1 和 b2 各包含多少个元素? StrBlob b1; { StrBlob b2 = {"a", "an", "th ...

  8. Linux内核设计与实现 总结笔记(第十二章)内存管理

    内核里的内存分配不像其他地方分配内存那么容易,内核的内存分配不能简单便捷的使用,分配机制也不能太复杂. 一.页 内核把页作为内存管理的基本单位,尽管处理器最小寻址坑是是字或者字节.但是内存管理单元MM ...

  9. C++Primer 第十二章

    //1.标准库提供了两种智能指针类型来管理动态对象,均定义在头文件memory中,声明在std命名空间. // shared_ptr:允许多个指针指向同一个对象. // unique_ptr:独占所指 ...

随机推荐

  1. myeclipse中导入的jquery文件报错(出现红叉叉,提示语法错误)

    转自:http://blog.csdn.net/simplty/article/details/7661504

  2. 【STL】-deque的用法

    初始化: #include <deque> deque<float> fdeque; 算法: fdeque.push_front(f); fdeque.push_back(f) ...

  3. 深入理解dispatch_queue

    Grand Central Dispatch是苹果过去几年创造出来的非常强大的API,在Let's Build系列的最新一期中,我们将探究dispatch_queue基础功能的重新实现.该主题是Rob ...

  4. 利用ps指令查看某个程序的进程状态

    ps -ef是查看所有的进程,然后用grep筛选出你要的信息. eg.

  5. namenode 无法启动之每次开机需要重新格式化-tmp

    最近遇到了一个问题,执行start-all.sh的时候发现JPS一下namenode没有启动        每次开机都得重新格式化一下namenode才可以        其实问题就出在tmp文件,默 ...

  6. Linux内核-模块编译和安装

    我安装Ubuntu的时候是没有安装源码的,在没有安装源码前 /usr/src/ 目录下是只有两个包含内核的头文件的文件夹的: 我的内核版本是: 所以接下来就是先安装内核源码: 执行后,/usr/src ...

  7. <转>用thinkPHP实现验证码的功能

    许多系统的登录都有验证码,而如果使用thinkPHP框架搭建网站的话,验证码的生成和验证就比较容易了 1.生成验证码 thinkPHP有对应生成验证码的方法 要使用验证码,需要导入扩展类库中的ORG. ...

  8. (转)SoftReference

    本文介绍对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.对象的强.软.弱和虚引用   在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说, ...

  9. 【LeetCode OJ】Linked List Cycle

    Problem link: http://oj.leetcode.com/problems/linked-list-cycle/ We set two pointers: the faster poi ...

  10. JavaScript经典语录

    Js的解析与执行过程: 全局中的解析和执行过程:一:预处理:创建一个此法环境LE, 扫描JS:1.用声明的方式声明的函数(不是函数表达式),2.用var定义的变量.加到预处理阶段的此法环境中 全局环境 ...