【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22602

istream_iteratorの仕様について
投稿者---DD.(2005/08/12 16:05:01)


お世話になっております。DD.でございます。

現在επιστημη様のHP等を徘徊しておりまして。
そこにVisual C++ 4.0とStandard C++ Library v1.2で書かれたという
(その頃にはプログラムのプの字も知りませんでしたが^^;)
STLのサンプルが乗っています。

入力された単語の出現頻度を求めるものです。
失礼してリンクを貼らせて頂きます<(_ _)>↓こちらなのですが、
http://www02.so-net.ne.jp/~epi-/html/stl/wordcount.html

そしてこれをVC++2005BETA2:XPの環境でお試ししようとしております。
以下ソースを抜粋:
#include <iostream>
#include <iterator>
#include <map>
#include <string>
#include <algorithm>

typedef std::string Key;

struct Count
{
int n_;
Count() : n_( 0 ) {}
void operator ++(int) { n_++; }
operator int() const { return n_; }
};

typedef std::map< Key, Count, std::less< Key > > Map;
typedef std::istream_iterator< Key, std::ptrdiff_t > str_in;

void print_pair( const std::map< std::string, Count,
         std::less< std::string > >::value_type &p )
{
std::cout << p.first << ':' << p.second << std::endl;
}

struct count_word
{
std::map< std::string, Count,
          std::less< std::string > > &map_;
count_word( std::map< std::string, Count,
           std::less< std::string > > &m ) : map_( m ) {}
void operator () ( const std::map< std::string, Count,               std::less< std::string > >::key_type &k )
{
map_[k]++;
}
};

int main()
{
std::map< std::string, Count,
          std::less< std::string > > wordmap;

std::for_each( std::istream_iterator< std::string,                       std::ptrdiff_t >( std::cin ),             std::istream_iterator< std::string,                        std::ptrdiff_t >(),
            count_word( wordmap ) );

std::for_each( wordmap.begin(), wordmap.end(),                  print_pair );

return 0;
}

typedef してある部分も展開してしまってまして申し訳ないです。
(自分なりに判別つきやすいように...)

以上のコードに対して下記エラーがでてしまいます。

wordcount.cpp(38) : error C2440: '<function-style- : 'std::istream' から 'std::istream_iterator<_Ty,_Elem>' に変換できません。

main 内の最初の for_each に対してです。

なぜ istream_iterator に対して、istream との変換エラーがでてくるのでしょうか?
istream_iteratorの仕様が変わったのかな?とか思ってみたりするのですが
なぜこのようなエラーになるのか原因を教えて頂ければと思います。

ストリーム系イテレータに関して未だ知識が乏しく、
勉強させて頂きたいと思います。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:istream_iteratorの仕様について 22603 tetrapod 2005/08/12 16:58:44
<子記事> Re:istream_iteratorの仕様について 22605 DD. 2005/08/12 17:12:18


No.22603

Re:istream_iteratorの仕様について
投稿者---tetrapod(2005/08/12 16:58:44)


当該ソースは古いC++仕様に基づいて書かれているので、現代コンパイラではエラーになります。

現代C++仕様では、使い方がより簡単になっていて
istream_iterator<string>(cin), istream_iterator<string>()
だけでいけます。

より正確には
template 型引数の数が増えたため ptrdiff_t の位置がずれた。
template 型引数の省略時解釈がうまく使えるように実装が変わった。
その結果、多くの場合 istream_iterator には型引数1つを与えるだけでよくなった。
といえそうです。



この投稿にコメントする

削除パスワード

No.22604

Re:istream_iteratorの仕様について
投稿者---DD.(2005/08/12 17:09:14)


tetrapodさん適切な回答とご指導ありがとうございます。

>template 型引数の数が増えたため ptrdiff_t の位置がずれた。
template <class T, class charT = char, class traits = traits<charT>,
class Distance = ptrdiff_t>
第4引数 Distance = ptrdiff_t 部分ですよね。
たしかに第2引数以降はデフォルトになってますね^^;

以前は第2引数に ptrdiff_t がきてたのかな?

よく理解できました。ありがとうございました。
そしてコンパイラ君がエラーを吐かなくなりました^^



この投稿にコメントする

削除パスワード

No.22606

Re:istream_iteratorの仕様について
投稿者---επιστημη(2005/08/12 17:42:35)


わはははは、出番ナシ orz
ありがとでしたー。



この投稿にコメントする

削除パスワード

No.22607

Re:istream_iteratorの仕様について
投稿者---DD.(2005/08/12 17:49:23)


επιστημη様勝手に引用してしまい申し訳ないです^^;

C++:language&libraries も拝見させてもらってます。
(大変意味不明なのは仕様ですorz)

#でも、おもしろい内容が盛りだくさん。


この投稿にコメントする

削除パスワード

No.22605

Re:istream_iteratorの仕様について
投稿者---DD.(2005/08/12 17:12:18)


お詫び。

コード部の抜粋内容がインデントされていませんでしたね。。。
申し訳ないです。

投稿時に"手動"でインデントつけてたんですが
自動で左寄せにされるんですね。しりませんでした;;

>ソースの添付は「HTML変換ツール」で字下げ!
これからはこれを使わせてもらいます。
<(_ _)>



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧