您的位置:首页 > 编程语言 > C语言/C++

C++ Primer : 第十二章 : 动态内存之shared_ptr类实例:StrBlob类

2015-08-21 09:55 357 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: