练习12.1 都是4个
练习12.2
#ifndef MYSTRBLOB_H
#define MYSTRBLOB_H
#include <initializer_list>
#include <memory>
#include <stdexcept>
#include <string>
#include <vector>
class StrBlob {
friend class StrBlobPtr;
public:
typedef std::vector<std::string>::size_type size_type;
// constructors
StrBlob() : data(std::make_shared<std::vector<std::string>>()) { }
StrBlob(std::initializer_list<std::string> il);
// size operations
size_type size() const { return data->size(); }
bool empty() const { return data->empty(); }
// add and remove elements
void push_back(const std::string &t) { data->push_back(t); }
void pop_back();
// element access
std::string& front();
std::string& back();
std::string& front() const;
std::string& back() const;
private:
std::shared_ptr<std::vector<std::string>> data;
// throws msg if data[i] isn't valid
void check(size_type i, const std::string &msg) const;
};
StrBlob::StrBlob(std::initializer_list<std::string> il) : data(std::make_shared<std::vector<std::string>>(il)){}
void StrBlob::pop_back() {
check(0,"pop_back on empty StrBlob");
data->pop_back();
}
void StrBlob::check(size_type i, const std::string& msg)const {
if (i >= data->size())
throw std::out_of_range(msg);
}
std::string& StrBlob::back() {
check(0,"back on empty StrBlob");
return data->back();
}
std::string& StrBlob::front() {
check(0, "front on empty StrBlob");
return data->front();
}
std::string& StrBlob::back() const{
check(0,"back on empty StrBlob");
return data->back();
}
std::string& StrBlob::front() const{
check(0, "front on empty StrBlob");
return data->front();
}
#endif
练习12.3 不需要 对象内容改变不需要对象是const类型。
练习12.4 i是size_type无符号型整数
练习12.5 优点:可以隐式转换,可以赋值构造 缺点:在不需要转换的地方可能自动转换。
练习12.6
void input(vector<int>* p) {
int k;
while(cin>>k)
p->push_back(k);
}
void output(vector<int>* p) {
for(auto k: *p)
cout << k << ' ';
}
int main(int argc, char const *argv[])
{
vector<int>* p1 = new vector<int>;
input(p1);
output(p1);
delete(p1);
return 0;
}
练习12.7
void input(shared_ptr<vector<int>> p) {
int k;
while(cin>>k)
p->push_back(k);
}
void output(shared_ptr<vector<int>> p) {
for(auto k: *p)
cout << k << ' ';
}
int main(int argc, char const *argv[])
{
shared_ptr<vector<int>> p1 = make_shared<vector<int>>();
input(p1);
output(p1);
return 0;
}
练习12.8 没有
练习12.9 line 2: r内存泄漏 line 4: r2指向q2指向的内存,原r2收回。
练习12.10 正确
练习12.11 p指向的内存被删除但还有可能使用p
练习12.12 a 合法 b 不合法 不能赋值内置指针给共享指针 c不合法,同b d合法
练习12.13 sp失效
练习12.15