【C++ Primer 习题集】(第5版):练习12.2:编写你自己的StrBlob类,包含const版本的front和back。【智能指针的简单使用】

【C++ Primer 习题集】(第5版)
练习12.2(P298):编写你自己的StrBlob类,包含const版本的front和back。

#include
#include
#include
#include
#include
#include
#include
#pragma warning(disable:4996)
using std::string; using std::vector; using std::make_shared; using std::shared_ptr; using std::size_t;
using std::initializer_list; using std::out_of_range; using std::cin; using std::cout; using std::endl;
class StrBlob {
public://公有成员
	StrBlob() { data = make_shared<vector<string>>(); }//参数为空的构造函数
	StrBlob(const initializer_list<string>& i) { data = make_shared<vector<string>>(i); }//包含一个initializer_list作参数的构造函数
	size_t size() const { return data->size(); }//返回已存储字符串数量的大小。
	bool empty() const { return data->empty(); }//返回容器是否为空
	string& front() const { return data->front(); }//返回容器最前端的字符串
	string& back() const { return data->back(); }//返回容器最后端的字符串
	void emplace_back(const string& s) { data->emplace_back(s); }//在尾部放入新字符串(C++11起)
	void push_back(const string& s) { data->push_back(s); }//在尾部放入新字符串
	void pop_back() { oor(0, "ERROR: Popping back on an empty StrBlob."); data->pop_back(); }//弹出(删除)最尾端的字符串
	void clear() { data->clear(); }//清除全部已存储的字符串
	bool operator==(const StrBlob& b) {//重定义==运算符,以便能够通过==方便地判断两个StrBlob是否相等
		if (this->size() != b.size())return false;
		for (size_t i = 0; i < this->size(); ++i)if ((*this->data)[i] != (*b.data)[i])return false;
		return true;
	}
	string& operator[](const size_t& n) { oor(n, "ERROR: Subscript out of range."); return (*data)[n]; }//重定义[]运算符,以便能够像访问数组一样访问每个保存的字符串。返回非常量时,允许通过该运算符赋值。
	const string& operator[](const size_t& n) const { oor(n, "ERROR: Subscript out of range."); return (*data)[n]; }////重定义[]运算符,以便能够像访问数组一样访问每个保存的字符串
private://私有成员
	shared_ptr<vector<string>> data;//数据存储区域(指针)
	void oor(const size_t& s, const string& msg) const { if (s >= data->size())throw out_of_range(msg); }//检查下标是否越界,如果是则抛出错误
};
int main() {
	std::ios::sync_with_stdio(false), std::cin.tie(0);
	StrBlob b1, b2, b3;
	b1.emplace_back("sin"), b1.emplace_back("cos"), b1.emplace_back("tan");
	cout << b1[0] << ' ' << b1[1] << ' ' << b1[2] << '\n';
	b1[0] = "SIN"; cout << b1[0] << '\n'; b1[0] = "sin";
	b2 = b1; cout << b2[0] << ' ' << b2[1] << ' ' << b2[2] << '\n';
	b2.emplace_back("cot"), b2.emplace_back("sec"), b2.emplace_back("csc");
	cout << b1[0] << ' ' << b1[1] << ' ' << b1[2] << ' ' << b1[3] << ' ' << b1[4] << ' ' << b1[5] << endl;
	system("pause");
	return 0;
}

你可能感兴趣的:(基础课,#,C,/,C++)