0

私は持っていboost::unordered_multimap< std::vector<int>, float>ます。マルチマップのクエリに使用するキーには0、無視したい追加の int が含まれている場合があります (ただし、マップに挿入されたキーには決して含まれません0)。

例:

int main() {
  typedef std::vector<int> Vec;
  typedef boost::unordered_multimap<Vec, float, MyHash, MyEqualKeys> Map;
  Map map;

  Vec vec1;
  vec1.push_back(2);
  vec1.push_back(6);
  map.insert(Map::value_type(vec1, 4.3));
  map.insert(Map::value_type(vec1, 6.8));

  Vec queryVec;
  queryVec.push_back(2);
  queryVec.push_back(0); // additional 0, to be ignored                                                                                                                         
  queryVec.push_back(6);
  for (std::pair<Map::iterator, Map::iterator> iter = map.equal_range(queryVec);
       iter.first != iter.second; ++iter.first) {
    std::cout << iter.first->second << std::endl; // 4.3 and 6.8
  }
}

ハッシュするキーの をMyHash無視するハッシュ関数を書きました。0

私の質問は次のとおりです。私が書くときMyEqualKeys、クエリキー(私の場合は追加の があるかもしれません0)が常に最初の引数であることが保証されていますか?

だから、私がこのファンクターを書くとき:

struct MyEqualKeys {
  bool operator()(Vec const& x, Vec const& y) const {...}
};

追加の?xを含めることができるのは引数のみです。0

上記で少し単純化したため、実際には a 以上のものをチェックする必要があり、引数も0チェックする必要があると少しコストがかかる可能性があるため、知りたいです(数百万のクエリの場合)。y

4

1 に答える 1

2

いいえ、そのような保証や要件はありません (順序付けされていない連想コンテナーのいずれか)。キーオブジェクトに「サニタイズ済み」フラグを追加することをお勧めします。

于 2012-06-19T07:00:39.490 に答える