唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

「Darts: Double-ARray Trie System」のサンプルコードが動かない

Double Arrayを使いたかったので、Dartsを使おうとしたらサンプルコードが動かなくて困りました。
g++でもclang++でもダメでした。
オプションの違いとかなんですかね?

exactMatchSearchに戻り値の型を指定したら一応動かせたんですが、なんかこれじゃない感が……。

動かないサンプルコード

DoubleArrayがDobuleArrayになっていたりして、そもそもコンパイルを通りそうにないです。

#include <iostream>
#include <darts.h>

int main (int argc, char **argv)
{
  using namespace std;

  Darts::DoubleArray::key_type   *str[] = { "ALGOL", "ANSI", "ARCO",  "ARPA", "ARPANET", "ASCII" }; // same as char*
  Darts::DobuleArray::result_type val[] = { 1, 2, 3, 4, 5, 6 }; // same as int 

  Darts::DoubleArray da;
  da.build (6, str, 0, val); 

  cout << da.exactMatchSearch("ALGOL") << endl;
  cout << da.exactMatchSearch("ANSI") << endl;
  cout << da.exactMatchSearch("ARCO") << endl;;
  cout << da.exactMatchSearch("ARPA") << endl;;
  cout << da.exactMatchSearch("ARPANET") << endl;;
  cout << da.exactMatchSearch("ASCII") << endl;;
  cout << da.exactMatchSearch("APPARE") << endl;

  da.save("some_file");
}

修正後

  • DobuleArrayのミスを修正
  • 一部変数をconstに。
  • exactMatchSearchがテンプレートのパラメータを特定できないと言われるので、泣きながらDarts::DoubleArray::result_typeを指定して無理やり動かしました。
#include <iostream>
#include <darts.h>

int main (int argc, char **argv)
{
  using namespace std;

  const Darts::DoubleArray::key_type   *str[] = { "ALGOL", "ANSI", "ARCO",  "ARPA", "ARPANET", "ASCII" }; // same as char*
  Darts::DoubleArray::result_type val[] = { 1, 2, 3, 4, 5, 6 }; // same as int 

  Darts::DoubleArray da;
  da.build (6, str, 0, val); 

  cout << da.exactMatchSearch<Darts::DoubleArray::result_type>("ALGOL") << endl;
  cout << da.exactMatchSearch<Darts::DoubleArray::result_type>("ANSI") << endl;
  cout << da.exactMatchSearch<Darts::DoubleArray::result_type>("ARCO") << endl;;
  cout << da.exactMatchSearch<Darts::DoubleArray::result_type>("ARPA") << endl;;
  cout << da.exactMatchSearch<Darts::DoubleArray::result_type>("ARPANET") << endl;;
  cout << da.exactMatchSearch<Darts::DoubleArray::result_type>("ASCII") << endl;;
  cout << da.exactMatchSearch<Darts::DoubleArray::result_type>("APPARE") << endl;

  da.save("some_file");
}

別のexactMatchSearch

サンプルコードではexactMatchSearchを↓のように使っていました。

cout << da.exactMatchSearch<Darts::DoubleArray::result_type>("ALGOL") << endl;

しかしexactMatchSearchはオーバーロードされていて以下のようにも書けるみたいです。

Darts::DoubleArray::result_type temp;
da.exactMatchSearch("ALGOL", temp);
cout << temp << endl;

本質的には変わらないですが、戻り値の型を一々指定するよりはこっちのほうがわかりやすい気がします。
というかexactMatchSearchの戻り値の型はテンプレートを使わないで内部で保持してるresult_typeを指定すればいいと思うのですが、なんでこういう設計になっているんだろう?

追記: Darts::DoubleArray::result_typeの代わりにDarts::DoubleArray::result_pair_typeを渡すと、一緒に長さを返してくれるみたいです