c++ primer 第十二章习题

练习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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值