您的位置:首页 > 其它

第十三章 13.5节练习

2014-09-12 23:29 155 查看
练习13.39

编写你自己版本的strVec,包括自己版本的reserve、capacity(参见9.4节,第318页)和resize(参见9.3.5节,第314也)

解答:

同样,这里的参考代码可以从书封底的网页中获得。

可以先自行实现,然后在去对比已经实现好的。

再加上调试,可能能获得更多。

练习13.40

为你的StrVec类添加一个构造函数,让它接受一个initializer_list<string>参数。

解答:

inline
StrVec::StrVec(std::initializer_list<std::string> il)
{
	// call alloc_n_copy to allocate exactly as many elements as in il
	auto newdata = alloc_n_copy(il.begin(), il.end());
	elements = newdata.first;
	first_free = cap = newdata.second;
}
将书中给出的是实现粘出来。

练习13.41

在push_back中,我们为什么在construct调用中使用前置递增运算?

如果使用后置递增运算的话,会发生什么?

解答:

如果使用前置递增运算符就会让地址先增加1,然后在进行移动构造。

这样在逻辑上是错误,也会造成程序产生段错误。

练习13.42

在你的TextQuery和QueryResult类(参见12.3节,第431页)中用你的StrVec类代替vector<string>,以此来测试你的StrVec类。

解答:

这个…… 先略过吧。

StrVec的整体设计,其实就和vector很相似了,可以直接进行替换。

练习13.43

重写free成员,用for_each和lambda(参见10.3.2节,第346页)来代替for循环destory元素。你更倾向于哪种实现,为什么?

解答:

auto SteVec::free = [&]() -> void{
   if(elements){
     for_each(elements, cap, alloc.destory);
     alloc.deallocate(elements, cap - elementd);
   }
}


练习13.44

编写标准库string类的简化版本,命名为String。你的类应该至少有一个默认构造函数和一个接受C分隔字符串指针参数的构造函数。

使用allocator为你的String类分配所需内存。

解答:

这里的实现可以将StrVec进行简化,其中需要注意的就是reallocate应该以什么样的方式进行增长。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: