2

おそらく簡単な解決策がある問題がありますが、しばらく見回しましたが、まだ成功していません。

次のような単純なクラスがあります。

class Node{
public:
int value;
bool visited;
Node(int argvalue) {value = argvalue;visited = false; }
bool operator==(const Node& n) {return (value == n.value);}
};

class MyHash {
size_t operator()(const Node& x) const { return std::hash<int>()(x.value); }
};

挿入しようとするとエラーが発生し、理由がわかりませんか? ハッシュ関数を間違って実装したのでしょうか、それとも等号演算子 == では十分ではありませんか?

unordered_map<Node, int, MyHash> my_items;
my_items.insert(Node(33), 894);
4

2 に答える 2

10

2つのパラメーターの挿入メソッドはどれも一致insert(key_type, mapped_type)しません。これはあなたが試みていることです。

マップはを保持するstd::pair<const Key, T>ため、明示的にペアを挿入する必要があります。

my_items.insert(std::make_pair(Node(33), 894));

または中括弧の初期化を使用します。

my_items.insert({Node(33), 894});

std :: unordered_map :: emplaceメンバー関数を使用できます。これにより、ペアのコンストラクター引数を渡すことができます。

my_items.emplace(Node(33), 894);

他のもの:

  • bool Node::operator==constである必要があります(比較によって、比較対象のオブジェクトが変更されないようにする必要があります)
  • size_t MyHash::operator()(...) const公開する必要があります。
于 2013-03-15T06:53:01.577 に答える
0

いくつかのエラーがあります。まず、これoperator()はクラスprivateMyHashあり、クラスのデフォルト アクセスはプライベートであるためです。としてマークするpublicか、に変更しstruct MyHashます。

第二に、そのような値を挿入することはできません。のようなものにする必要がありmy_items.insert(std::make_pair(Node(33), 894))ます。

于 2013-03-15T06:56:56.877 に答える