无我

让内心永远燃烧着伟大的光明的精神之火!
灵活的思考,严谨的实现
豪迈的气魄、顽强的意志和周全的思考

STL问题系列一

一直在学习STL,用的书籍是王昕译的《C++ STL 中文版》,学习中产生很多问题,特在这向各位高手请教,以下问题基本是按教材章节顺序给出的,如果您手中也刚好有这样一本书,那就太好了,这样就不会因为我理解的肤浅而让您不明白题意,总之,请各位高手不吝赐教:
STL问题系列一
1、《C++STL 中文版》第一章课后习题:1-4、解释为什么在所写算法中使用其他种类的迭代器,而不是随机存取迭代器?1-5、解释为什么宁愿定义一个仅能通过迭代器来存取的数据结构,而不是让他可以被随机存取呢?

2、《C++STL 中文版》迭代器部分一直介绍输入、输去、前向、双向、随机迭代器,然而我以为只要以<iterator>建立的对象就具有随机迭代器的功能,为何讨论前向、双向呢?

3、从《C++STL 中文版》第一章后面的习题看前向、双向、随机迭代器从性质和条件上有较大差别,请问这在深层上如何理解呢?

4、《C++STL 中文版》第二章习题:2-3“当T和U中有一个是const类型时,我们可能需要经常构造一个pair<T,U>对象。下面的定义是否可以达到这样的效果?如果不可以,请说出你的理由。
template<class T,class U>inline pair<T,U> make_pair(T& x,U& y)
{return  (pair<T,U> (x,y));}”

5、《C++STL 中文版》2-4“请描述出一种可能的编码情况,使得表达式 x.first < y.first ||
!(y.first < x.first)  && x.second < y.second 并不等同于 x.first < y.first || x.first == y.first  && x.second < y.second。”

6、STL在他的文件中定义了指针和引用,但同时还总是定义常指针和常引用,为何两者必须分开实现呢?

7、《C++STL 中文版》第四章:4-6“写出一个分配器,它将对象存储在一个磁盘文件中,并且维护一个小小的高速缓存来存储程序内存中的有效对象。”

8、《C++STL 中文版》第四章:4-7“在那种情况下,分配器应该以与模板类allocator不一致的方式来定义成员函数construct和destroy?”

9、<algorithm>文件中sort_heap函数功能:void  sort_heap(RanIt  first, RanIt  last)重排由区间[first,last)中的迭代器指定的序列,产生一个按 operator <排序的序列。但是最初的序列也必须是一个同样按 operator < 排序的堆。这样看,那该函数的实际意义呢?

posted on 2007-09-13 14:36 Tim 阅读(1654) 评论(8)  编辑 收藏 引用 所属分类: C/C++语言

评论

# re: STL问题系列一 2007-09-13 15:03 Minidx全文检索

怎么感觉像在考试……呵呵  回复  更多评论   

# re: STL问题系列一 2007-09-13 20:21 蚂蚁终结者

这本书我没看过,不过The C++ Standard Library很不错  回复  更多评论   

# re: STL问题系列一 2007-09-13 21:48 沐枫

这个不要放在首页吧...  回复  更多评论   

# re: STL问题系列一 2007-09-13 22:53 沐枫

1、《C++STL 中文版》第一章课后习题:1-4、解释为什么在所写算法中使用其他种类的迭代器,而不是随机存取迭代器?1-5、解释为什么宁愿定义一个仅能通过迭代器来存取的数据结构,而不是让他可以被随机存取呢?
>>
1-4,并不是说不能使用随机存取迭代器.比如sort就是使用随机迭代器.设计一个算法,要选择哪种迭代器,是要看具体什么算法.如果前向能满足,就选前向,否则才考虑双向,最后再考虑随机.
1-5,问题与1-4是一致的.这里也不是宁愿不宁愿的问题.不同的数据结构有不同的目的.没有特别的要求.这两个题稍有误导.主要是STL中的算法基本上都是通过迭代器存取.因此,符合迭代器的结构,就可以直接使用上这些算法.接口也统一,设计也清楚.

2、《C++STL 中文版》迭代器部分一直介绍输入、输去、前向、双向、随机迭代器,然而我以为只要以<iterator>建立的对象就具有随机迭代器的功能,为何讨论前向、双向呢?
>>
迭代器是一种存取容器数据结构的方式.并不是所有的容器都可以直接支持随机访问的,或者说,用随机访问效率非常低下.比如链表.(双向链表和单向链表等)

3、从《C++STL 中文版》第一章后面的习题看前向、双向、随机迭代器从性质和条件上有较大差别,请问这在深层上如何理解呢?
>>
显然,前向指只能向从前向后依顺序访问(如单向链表)
.双向指可以向前,也可以向后依顺序访问(如双向链表)
.随机,则是可以随机访问容器中的任何一个元素(如数组).

4、《C++STL 中文版》第二章习题:2-3“当T和U中有一个是const类型时,我们可能需要经常构造一个pair<T,U>对象。下面的定义是否可以达到这样的效果?如果不可以,请说出你的理由。
template<class T,class U>inline pair<T,U> make_pair(T& x,U& y)
{return (pair<T,U> (x,y));}”
>>
这个
这样的效果是什么效果?是指能不能构造成功?当然可以构造成功啦.例如:int a=2,b=4;pair<const int, int> c(make_pair(a,b));


5、《C++STL 中文版》2-4“请描述出一种可能的编码情况,使得表达式 x.first < y.first ||
!(y.first < x.first) && x.second < y.second 并不等同于 x.first < y.first || x.first == y.first && x.second < y.second。”
>>
没看过这本书.不明白要求什么写哪部份的编码.单从表达式来说.
随便写一个不符合要求的operator == 就好了(比如operator==返回<的结果).

6、STL在他的文件中定义了指针和引用,但同时还总是定义常指针和常引用,为何两者必须分开实现呢?
>>
常指针和指针...这指的是typedef吗?typedef谈不上实现不实现的吧.只不过是一个typedef而已啦.C++的typedef并不是一个真正的类型,只是类型的别称而已.

7、《C++STL 中文版》第四章:4-6“写出一个分配器,它将对象存储在一个磁盘文件中,并且维护一个小小的高速缓存来存储程序内存中的有效对象。”
>>
这个...为什么不自已试着写写呢.

8、《C++STL 中文版》第四章:4-7“在那种情况下,分配器应该以与模板类allocator不一致的方式来定义成员函数construct和destroy?”
>>
allocator的construct是用placement new来实现的.construct的目的就是用于调用构造函数.在C++中,似乎只有用placement new的方式来手工调用构造函数.不一致的话,是不是指不用调用构造函数,或是有特别的调用方式?想不出来可以不用调用构造函数的实现或别的调用方式.
或者是不一致的方式另有所指?

9、<algorithm>文件中sort_heap函数功能:void sort_heap(RanIt first, RanIt last)重排由区间[first,last)中的迭代器指定的序列,产生一个按 operator <排序的序列。但是最初的序列也必须是一个同样按 operator < 排序的堆。这样看,那该函数的实际意义呢?
>>答:
堆排序.按<排序的堆,并不等于整个序列是按<排好序的.例如:( 9 6 8 4 1 5 7 3 2 0 )就是按<排好序的堆.但按<排好序的序列是(1 2 3 4 5 6 7 8 9)  回复  更多评论   

# re: STL问题系列一 2007-09-14 09:28 Tim

沐枫,你好!非常感谢你这样详尽的回答我这么多问题。我收获很大,谢谢!这里对于第5题,“《C++STL 中文版》2-4“请描述出一种可能的编码情况,使得表达式 x.first < y.first ||
!(y.first < x.first) && x.second < y.second 并不等同于 x.first < y.first || x.first == y.first && x.second < y.second。”事实上,书中给出的C++ STL源码中在比较时大部分都是采用这种写法。其实逻辑是很明显的,例如对pair对x和y,先比较x.first < y.first ,不成立。当x.first == y.first 时,在比较x.second < y.second,但写法在判断
x.first < y.first 不成立后,STL的作者好像认为!(y.first < x.first)的作用要大于x.first == y.first ,而按题意,他还要我们给出这样的编码,我给不出来,可能是经验有限。你的观点呢?
对第8题:8、《C++STL 中文版》第四章:4-7“在那种情况下,分配器应该以与模板类allocator不一致的方式来定义成员函数construct和destroy?”
>>
allocator的construct是用placement new来实现的.construct的目的就是用于调用构造函数.在C++中,似乎只有用placement new的方式来手工调用构造函数.不一致的话,是不是指不用调用构造函数,或是有特别的调用方式?想不出来可以不用调用构造函数的实现或别的调用方式.
或者是不一致的方式另有所指?
>>我想你的分析是对的,应该是一不一样的方式来定义成员函数construct和destroy,只是我看完了《C++STL 中文版》,对分配器的认识还是很模糊。不明白其深层原理。@沐枫
  回复  更多评论   

# re: STL问题系列一 2007-09-14 17:20 沐枫

关于 < 的比较
你有没有注意到,大多数的STL算法,都只需要传进去一个比较函数就可以了?
默认情况下,传进去的就是 < 比较.
那么,如果你要比较 a == b 怎么办?
只有 !(a<b) && !(b<a)了.
所以,并非是说 ==的作用要小于<,而是条件所限.既然一个比较就可以了,总不能让你提供一大堆的比较函数吧?  回复  更多评论   

# re: STL问题系列一 2007-09-16 12:25 Tim

恩,你说得对!很有道理,谢谢!
@沐枫
  回复  更多评论   

# re: STL问题系列一 2007-09-30 14:27 空明流转

@Tim
请参考 Effective STL的《注意区分equalization 和 equivalence》  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2007年9月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

导航

统计

公告

本博客原创文章,欢迎转载和交流。不过请注明以下信息:
作者:TimWu
邮箱:timfly@yeah.net
来源:www.cppblog.com/Tim
感谢您对我的支持!

留言簿(9)

随笔分类(173)

IT

Life

搜索

积分与排名

最新随笔

最新评论

阅读排行榜