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;
}