• ベストアンサー

mapのポインタ

C++標準ライブラリ map の使用法に関して質問させてください。 winXP, minGW環境最近でC++のプログラミングを始めました。 これまでperlを使っており、とくにハッシュを多用していました。 たとえば入力ファイルに区切りのついたデータがあり、区切りごとに個別のハッシュをつくり、ハッシュのリファレンスの配列を作成します。その後に配列にはいったすべてのリファレンスからハッシュを呼び出して、ハッシュのデータをつかって処理を行う などです。 *入力ファイルから区切りごとにハッシュ%hashを作成 $ref_of_hash = \%hash; push (@array_hash, $ref_of_hash); *ここまでは入力ファイルにしてループ処理 foreach $ref ( @array_hash){      %hash_again = %$ref; *ここでハッシュをつかって処理を行う。 } c++の標準ライブラリにmapがあり、ハッシュとは多少異なるとはいえ、私の使用用途には問題なかったので使い始めました。ですが、マップのポインタをつかった上記のような処理の方法がわからず困っています。 1)mapのポインタから mapの各要素を呼び出すにはどのようにしたらよいでしょうか? 2)mapのポインタをつかった場合 map<double,double>::iterator it; for( it = my_map.begin(); it != my_map.end(); it ++){ //do something } のようなイテレータを使う場合、.begin .engはポインタを使ってどのように記述すればよいでしょうか。 3)このようなmapのポインタを利用したソースが書かれているサイトなどがあれば教えていただけないでしょうか。 C++をはじめて間もないので用語の間違いや勘違いがあるかもしれませんが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

std::mapのキーにdoubleを使うのは賛成できませんが... 正攻法では、 template <typename Key, typename T> struct f : std::unary_function<void, std::pair<void, std::pair<Key, Y> > {  void operator()(std::pair<Key, T> const& arg)  {   // 何らかの処理  } }; というファンクタを作っておいて.. std::map<double, double>* ptr = &my_map; std::for_each(ptr->begin(), ptr->end(), f()); とします。 自分でループを書くのであれば、 std::map<double, double>* ptr = &my_map; for (std::map<double, double>::const_iterator it = ptr->begin(), last = ptr->end(); it != last; ++it) {  double key = it->first;  double value = it->second;  // 何らかの処理 } でよいでしょう。

hydrozoa
質問者

お礼

ありがとうございます。 ptr->begin() でいけるわけですね。 ネットを検索してもなかなか解法がみつからず困っていたところです。早速試してみようと思います。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> 以下すっごい挙げ足とりなんですけど, for_each の呼び出しで f にテンプレートパラメータは不要なんでしたっけ>#1. すみません。修正忘れです。 他にも細かい間違いがありますが、まあいいでしょう。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

一般にポインタ p に対し (*p).hoge と p->hoge は同じ効果を持ちます. 以下すっごい挙げ足とりなんですけど, for_each の呼び出しで f にテンプレートパラメータは不要なんでしたっけ>#1.

hydrozoa
質問者

お礼

ありがとうございます。 ポインタは勉強中なので勉強になりました。

関連するQ&A