使用shared_ptr编写StrBlob类

StrBlob类:

#include <iostream>
#include <set>
#include <vector>
#include <map>
#include <fstream>
#include <sstream>
#include <unordered_set>
#include <memory>

/* 该类型使用std::shared_ptr对std::vector<std::string>> 进行封装
*  即使StrBlob被拷贝和赋值 也能保证内存中只保存一份std::vector<std::string>>
*  即让多个StrBlob对象共享一份数据
*/ 
class StrBlob {
public:
	typedef std::vector<std::string>::size_type size_type;

	// 默认初始化 初始化一个空的vector
	StrBlob() : data(std::make_shared<std::vector<std::string>>()) {}

	// 提供列表初始化 il参数交给vector的构造函数进行列表初始化
	StrBlob(std::initializer_list<std::string> il) : data(std::make_shared<std::vector<std::string>>(il)) {}

	size_type size() const { return data->size(); } // 加const是为了让const修饰的StrBlob对象也能调用该函数
	bool empty() const { return data->empty(); }
	// 添加和删除元素
	void push_back(const std::string& str) { data->push_back(str); }
	void pop_back() { check(0, "pop_back error"); data->pop_back(); }

	// 访问元素 同时提供了const版本 为了让const修饰的StrBlob对象也能调用该函数(非const对象优先调用非const重载的函数)
	std::string& front() { check(0, "front error"); return data->front(); }
	std::string& back() { check(0, "back error"); return data->back(); }
	std::string& front() const { check(0, "front error"); return data->front(); }
	std::string& back() const { check(0, "back error"); return data->back(); }

private:
	std::shared_ptr<std::vector<std::string>> data;

	// 检查data[i]是否越界 越界则抛出一个异常
	void check(size_type i, const std::string& msg) const { if (i >= data->size()) throw std::out_of_range(msg); }

};

int main()
{
	// obj1与obj2的数据成员data中的数据 是共享的
	StrBlob obj1 = { "1", "2", "3", "4" };
	StrBlob obj2 = obj1;

	std::cout << obj2.size() << std::endl; // 输出4
	obj1.pop_back();
	std::cout << obj2.size() << std::endl; // obj1 pop出去一个元素 obj2中的size函数返回值也变为了3

	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值