0

中置記法から後置記法に変換する算術パーサーに関数を格納するためのデータ構造を改善するにはどうすればよいですか?

現時点では、char 配列の配列を使用しています。

char *funct[] = { "sin", "cos", "tan"... }
char text[] = "tan";

この実装は少し混乱しており、char が関数であることをテストすると、次の比較が行われます。

if ( strcmp ( funct[0], text) == 0 ) || ( strcmp ( funct[1], "text ) == 0 ) || ( strcmp ( func[2], text) == 0 ))
{
  ... do something
}

(または for サイクル バージョン)。

多くの関数 (および多くの比較) がある場合、インデックス参照はエラーにつながり、明確ではありません。新しい関数を削除/追加するときに、インデックスを変更する必要もあります....

このような構造を改善して、読みやすく、保守しやすく、スケールアップしやすいようにするにはどうすればよいでしょうか。

私はenumについて考えていました

typedef enum
{
  Fsin=0,
  Fcos,
  Ftan
} TFunctions;

その結果

if ( strcmp ( funct[Fsin], text) == 0 ) || ( strcmp ( funct[Fcos], "text ) == 0 ) || ( strcmp ( func[Ftan], text) == 0 ))
{
...

しかし、より良い解決策があるかもしれません...

4

2 に答える 2

1

std::map を使用できます。

enum functions
{
    sin,
    cos,
    tan
};

std::map<std::string, unsigned char> func_map;
func_map["sin"] = sin;
func_map["cos"] = cos;
func_map["tan"] = tan;

// then:
std::string text = "cos";

std::map<char*, unsigned char>::iterator it;
it = func_map.find(text);

if(it != func_map.end())
{
    // ELEMENT FOUND
    unsigned char func_id = it->second;
}
else
{
    // NOT FOUND
}
于 2012-11-04T17:19:26.067 に答える
0

最速のコードを得るには、次のようなマップを使用できます。

typedef std::map<std::string, func_t> func_map;
func_map fm;
fm["sin"] = sin_func(); // get value of this entry from somewhere
fm["cos"] = cos_func(); // for example sin_func or cos_func

auto i = fm.find( "sin" );
if( i != fm.end() ) {
    func_t f = i->second; // value found, we may use it.
}

また、実際に多くのアイテムがある場合は、std::unordered_map代わりに使用できますstd::map

于 2012-11-04T17:39:15.957 に答える