0

順序付けされていないマップ検索関数が bool 値を返すようにしたい場合、どうすればそれを行うことができますか?

ここに私のコードがあります。

bool NS_SymbolTable::SymbolTable::Contains(std::string lexeme)
    {
        SymbolTable *tempSymbolTable = this;
        std::unordered_map<std::string, Identifier*>::iterator it = tempSymbolTable->hashtable.find(lexeme);

        return std::boolalpha;
    }

他に何をする必要がありますか? boolを返すことは可能ですか? 私が見つけたこれに関するドキュメントはほとんどありません。

これは、 http://msdn.microsoft.com/en-us/library/bb982431.aspxから例を取得した場所です

4

5 に答える 5

2

tempSymbolTable->hashtable.find(lexeme)失敗すると返さtempSymbolTable->hashtable.end()れるため、この結果を非常に簡単に bool に変換できます。

return tempSymbolTable->hashtable.find(lexeme) != tempSymbolTable->hashtable.end();

また、これを一時変数に割り当ててそれを処理する必要はありません。関数は次のように縮小できます。

bool NS_SymbolTable::SymbolTable::Contains(std::string lexeme)
{
    return hashtable.find(lexeme) != hashtable.end();
}
于 2011-09-21T20:03:13.253 に答える
1
bool NS_SymbolTable::SymbolTable::Contains(std::string lexeme)
{
    SymbolTable *tempSymbolTable = this;
    return tempSymbolTable->hashtable.end() != tempSymbolTable->hashtable.find(lexeme);

}
于 2011-09-21T20:04:05.317 に答える
1

find の戻り値を tempSymbolTable->hastable.end() に対してテストする必要があります。それらが等しい場合は、要素が見つかりませんでした。find がこのように機能する理由は、現在の形式では bool のみを返すものよりも一般的だからです。

于 2011-09-21T20:04:23.410 に答える
1

ドキュメントについては、std::unordered_map::find を参照してください。そこには次のように書かれています。

キー key を持つ要素への値イテレータを返します。そのような要素が見つからない場合は、末尾 (end() を参照) イテレータが返されます。

要素が存在するかどうかを示すブール値を取得するには、次を使用します

bool contained = it != tempSymbolTable->hashtable.end();
于 2011-09-21T20:04:28.613 に答える
0

std::unordered_map::find()は、他の標準コンテナーの検索関数と同様にend()、失敗すると戻ります。

これを試して:

bool NS_SymbolTable::SymbolTable::Contains(std::string lexeme)
{
  SymbolTable *tempSymbolTable = this;
  std::unordered_map<std::string, Identifier*>::iterator it = 
    tempSymbolTable->hashtable.find(lexeme);

  return it != tempSymbolTable->hashtable.end();
}

参照:

EDIT : 戻り値の意味を変更します。

于 2011-09-21T20:05:51.967 に答える