0

我有一个boost::unordered_multimap< std::vector<int>, float>. 我用来查询多映射的键可能包含0我想忽略的其他整数(但插入到映射中的键从不包含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 回答