C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: hash_mapの使い方


(過去ログ 30 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■14571 / inTopicNo.1)  hash_mapの使い方
  
□投稿者/ 出水 (1回)-(2008/02/21(Thu) 23:08:17)

分類:[C++/CLI] 

バイト配列から数値を取ってくる辞書を作りたくて、
cliext::hash_map<array<char> ^, int> という型を宣言したいのですが、
hash_mapに比較やハッシュ生成を引き渡す方法がわかりません

MSDNのサンプルにはcliext::greater<> を最初に渡してたのですが、
bool compare(array<char>^, array<char>^) という関数を渡してもエラーになってしまいます

STL/CLIの資料はまだ少なくて困ってますので、ご教示お願いします
引用返信 編集キー/
■14573 / inTopicNo.2)  Re[1]: hash_mapの使い方
□投稿者/ επιστημη (835回)-(2008/02/22(Fri) 01:25:42)
επιστημη さんの Web サイト
さてと、僕の出番だ ^^;

#include <iostream>
#include <cliext/hash_map>

using namespace System;

/* 等しかったらtrueを返せ */
bool my_comp(array<char>^ k1, array<char>^ k2) {
  if ( k1->Length != k2->Length) return false;
  for ( int i = 0; i < k1->Length; ++i ) {
    if ( k1[i] != k2[i] ) return false;
  }
  return true;
}

/* hash値を返せ */
int my_hash(array<char>^ k1) {
  int result = 0;
  for each ( char item in k1 ) {
    result = result*3 + item;
  }
  return result;
}

int main() {
  typedef cliext::hash_map<array<char>^, int> my_hashmap;

  // 上記my_comp, my_hash から delegateを起こしてコンストラクタに渡す。
  my_hashmap hm(gcnew my_hashmap::key_compare(&my_comp), gcnew my_hashmap::hasher(&my_hash));

  array<char>^ a1 = gcnew array<char>{ 1, 2, 3};
  array<char>^ a2 = gcnew array<char>{ 4, 5, 6};
  array<char>^ a3 = gcnew array<char>{ 7, 8, 9};

  // hash_mapにセット
  hm[a1] = 123;
  hm[a2] = 456;
  hm[a3] = 789;

  // 表引きできるかな?
  std::cout << hm[a1] << std::endl;
  std::cout << hm[a2] << std::endl;
  std::cout << hm[a3] << std::endl;
}

引用返信 編集キー/
■14585 / inTopicNo.3)  Re[2]: hash_mapの使い方
□投稿者/ επιστημη (836回)-(2008/02/22(Fri) 12:13:04)
επιστημη さんの Web サイト
> /* 等しかったらtrueを返せ */
> bool my_comp(array<char>^ k1, array<char>^ k2) {
> if ( k1->Length != k2->Length) return false;
> for ( int i = 0; i < k1->Length; ++i ) {
> if ( k1[i] != k2[i] ) return false;
> }
> return true;
> }

ごめん、これじゃいけない気がする。
weak-orderingかな...
引用返信 編集キー/
■14591 / inTopicNo.4)  Re[3]: hash_mapの使い方
□投稿者/ επιστημη (837回)-(2008/02/22(Fri) 13:33:29)
επιστημη さんの Web サイト
比較関数はおそらく↓コレが正解。

/* !(k1 < k2) だったらtrueを返せ */
bool my_comp(array<char>^ k1, array<char>^ k2) {
  bool result;
  for ( int i = 0; i != k1->Length && i != k2->Length; ++i ) {
    if ( k1[i] < k2[i] ) return false;
    if ( k2[i] < k1[i] ) return true;
  }
  return !(k1->Length < k2->Length);
}

引用返信 編集キー/
■14609 / inTopicNo.5)  Re[4]: hash_mapの使い方
□投稿者/ 出水 (2回)-(2008/02/22(Fri) 20:42:07)
ありがとうございます
さすが、C++に定評のあるεπιστημη さんです!

>my_hashmap hm(gcnew my_hashmap::key_compare(&my_comp), gcnew my_hashmap::hasher(&my_hash));
.NETだからボックス化しなきゃならなくて
関数ポインタをそのまま引き渡せないからこうなるんですか!
やっと理解できました

http://msdn2.microsoft.com/en-us/library/bb398039.aspx
>If key_comp()(X, Y) && key_comp()(Y, X) is true, then X and Y are said to have equivalent ordering.

>Any ordering rule that behaves like operator<=(key_type, key_type), operator>=(key_type, key_type) or operator==(key_type, key_type) defines eqivalent ordering.

比較関数、ここ見ると comp(x,y) && comp(y,x) が真 で判定しているから
<= か == か >= のどれかならいいよー、って意味だと思うんですけど…あってるのかな?

実行効率からいくと==でOKだと思うんですが、それにしても二回関数が呼ばれるのが負けた気分…
STLのhash_mapは==だったのに何でこんな謎仕様なんでしょう…不思議
解決済み
引用返信 編集キー/
■14613 / inTopicNo.6)  Re[5]: hash_mapの使い方
□投稿者/ επιστημη (838回)-(2008/02/22(Fri) 21:43:13)
επιστημη さんの Web サイト
2008/02/22(Fri) 21:46:13 編集(投稿者)

> STLのhash_mapは==だったのに何でこんな謎仕様なんでしょう…不思議

どっちみちTR1でunordered_xxxが出てくればお払い箱ですし。
http://codezine.jp/a/article/aid/2171.aspx

解決済み
引用返信 編集キー/
■14652 / inTopicNo.7)  Re[6]: hash_mapの使い方
□投稿者/ 倉田 有大 (139回)-(2008/02/24(Sun) 19:54:03)
No14613 (επιστημη さん) に返信
> 2008/02/22(Fri) 21:46:13 編集(投稿者)
>
>>STLのhash_mapは==だったのに何でこんな謎仕様なんでしょう…不思議
>
> どっちみちTR1でunordered_xxxが出てくればお払い箱ですし。
> http://codezine.jp/a/article/aid/2171.aspx

あかん、もう最近のC++のテンプレートは読めない^^;
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -