| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 682 人关注过本帖
标题:下面摘自c++primer3rd第三版第263页至264页中原文-》是不是有错?
只看楼主 加入收藏
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
结帖率:88.89%
收藏
已结贴  问题点数:0 回复次数:12 
下面摘自c++primer3rd第三版第263页至264页中原文-》是不是有错?
void  
TextQuery::  
build_word_map()  
{  
  word_map = new map< string, loc*, less<string>, allocator >;  
 
 typedef map<string,loc*,less<string>,allocator>::value_type  
  value_type;  
 
 typedef set<string,less<string>,allocator>::difference_type  
  diff_type;  
 
 set<string,less<string>,allocator> exclusion_set;  
  ifstream infile( "exclusion_set" );  
 
  if ( !infile )  
 {  
  static string default_excluded_words[25] = {  
  "the","and","but","that","then","are","been",  
  "can","can't","cannot","could","did","for",  
  "had","have","him","his","her","its","into",  
  "were","which","when","with","would"  
  };  
  cerr << "warning! unable to open word exclusion file! -- "  
  << "using default set\n";  
  copy( default_excluded_words, default_excluded_words+25,  
  inserter( exclusion_set, exclusion_set.begin() ));  
 }  
 else {  
  istream_iterator< string, diff_type >   
  input_set( infile ), eos;  
  copy( input_set, eos,  
  inserter( exclusion_set, exclusion_set.begin() ));  
 }  
   
 // 遍历单词, 输入键/值对  
  vector<string,allocator> *text_words = text_locations ->first;  
  vector<location,allocator> *text_locs = text_locations ->second;   
  register int elem_cnt = text_words ->size();  
  for ( int ix = 0; ix < elem_cnt; ++ix )  
 {  
  string textword = ( *text_words )[ ix ];  
  if ( textword.size() < 3 ||  
  exclusion_set.count( textword ))  
  continue;  
  if ( ! word_map->count((*text_words)[ix] ))  
  { // 没有, 添加:  
  loc *ploc = new vector<location,allocator>;  
  ploc->push_back( (*text_locs)[ix] );  
  word_map->insert( value_type( (*text_words)[ix], ploc ));  
  }  
  else (*word_map)[(*text_words)[ix]]->  
  push_back( (*text_locs)[ix] );  
 }  
}  



上面代码摘自 c++primer3rd第三版 pdf格式第263页至264页(第6章抽象容器类型最后完整程序中TextQuery类的成员函void  
TextQuery:: build_word_map()  
其中,红色部分(也就是下面一行
istream_iterator< string, diff_type >
)这半个语句是不是有错?我怎么也看不懂。调试也不行。只有把后面的(, diff_type)去掉才能调试成功,所以我猜是不是书上写错了?去掉 (, diff_type)后对程序有没有影响?有什么影响?
在几个地方都看见有这种说法,说 istream_iterator 只支持单一类型,是这样吗?我猜,如果真是只支持单一类型,那么应该是书上写错了。到现在我可以确定书上有几处错了,但这里我不知道,请高手指教。
请不要叫我百度。我百度了很多次了。 也请不要复制粘贴。谢谢。
搜索更多相关主题的帖子: void 264 
2011-04-29 21:15
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:20 
百度了很多次,那去google啊。
STL都是有源码的。你可以看看源码找问题出在哪了。
在SGI STL中
istream_iterator 的默认DIstance 为ptrdiff_t,set容器中的diffrence引用自RB-Tree,在RB-Tree中的有 typedef ptrdiff_t diffrence,MS用的STL与SGI 的不尽相同,自己看。。。在SGI STL中有一个老版本的istream_iterator类,形式为
template<class T,class Distance=ptrdiff_t>
class istrean_iterator{...}。
istream_iterator这个类得形式就是问题的关键了。
只支持单一类型?这个我不明白怎么说、

离恨恰如春草,更行更远还生。
2011-04-29 22:13
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:0 
程序代码:
template<class _Ty,
    class _Elem = char,
    class _Traits = char_traits<_Elem>,
    class _Diff = ptrdiff_t>
    class istream_iterator
        : public iterator<input_iterator_tag, _Ty, _Diff,
            const _Ty *, const _Ty&>

istream_iterator<string,char,char_traits<char>,short> 
在VC9.0里查看头文件<iterator>。可以知道istream_itetator后面还有三个默认类类型参数。diff_type 应该是最后一个默认类类型参数。

迭代的是人,递归的是神。
2011-04-30 08:19
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
string 呀 stream 的模板一般都比较复杂。没什么特别需要一般只要一个模板参数就够了。传不熟悉的模板参数时要去查查资料。
2011-04-30 10:15
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
收藏
得分:0 
感觉都说得很模糊。
具体的情况是:如果按原代码用Cfree5编译,会在红色位置显示 当前域中 istream_iterator 未定义。
据二三楼的提示,我猜测,上面的代码不存在对与错的关系,只是当前编译器未提供该函数的相对声明和定义,可能是cfree5的库文件不全或不标准的原因。如果这样的话,只有等到把这书看完自己重载一个istream_iterator.才能求解。是这样吗?

2011-04-30 15:12
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:0 
打开cfree5带的<iterator>里istream_iterator的声明和定义。

迭代的是人,递归的是神。
2011-04-30 15:57
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
收藏
得分:0 
明白方法了。但知识准备不够。。。谢谢。
2011-04-30 17:54
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
istream_iterator这个东西能少用就少用,你重载一个?是完全没必要的。这个也没什么标准,看用的那个STL了。你那种写法在,,在2楼已经说了。另外LZ也不是初学了,为啥还在用C-Free呢,

离恨恰如春草,更行更远还生。
2011-04-30 18:33
laigaoat2005
Rank: 4
等 级:业余侠客
帖 子:388
专家分:226
注 册:2007-4-5
收藏
得分:0 
回五楼,谢谢。我的确不是初学者,因为07年就开始学了。但,我的确又是初学者,到现在感觉自己还没有进门。

呵呵,说起来有些害羞。相当于初中文化的我在工作之余,07年开始自学老谭的C教程。看了四个月,肯了个大概,又自学高中数学,接下来又自学高数一、高数二,学到微分后面一点点就不能进行下去了,又开始自学asp,sql,然后自已动手写了个小asp站(有点丑,但开心,那是自己写的嘛,当时还有点小小的成就感),开两年网站,没有收入。昨年把Cprimer3rd初看了多半,后来工作忙,丢了大半年……前一个月开始重新细看 cpp primer 3rd……
感觉最后悔的是当时没有选择读高中,带的帐太多……羞人的事就不说了。

至于编译器,开妈用tc2,后来用cfree3.5,后来用vs2008,现在觉得cfree小巧才想起用来的。听你这么 一说,我还真不知道用什么好了……请明示。。。。谢谢
2011-04-30 19:12
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
恩,LZ毅力不错,能坚持下。既然你边工作边学习,那学习时间必然会少,语言类的还是先学一种为好,SQL可以到后面再学。
数学不能求一时,它是一个漫长的过程。不知道你工作于软件是否相关,学编程又是为了什么。C++primer这本书将的就是细节语法的东西,有些东西是不必细究的。某些东西也不用第一次看就要弄懂,相关知识需要知道,以后之本书就当一个手册看就行。
至于编译器,C-FREE我也用过,甚至在前不久我电脑上还有,是5.0之前的版本,后来装系统了,也没有安装C-Free.我也是看中他的轻巧,写一些小程序用着方便,但涉及语法的知识与大点的程序还是用的VS的。像你现在学习涉及语法的知识还是用个比较好的编译器用吧、

离恨恰如春草,更行更远还生。
2011-04-30 19:37
快速回复:下面摘自c++primer3rd第三版第263页至264页中原文-》是不是有错?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028565 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved