boost :: unordered_multimap中的等键函数:查询键是否保证是第一个arg?

时间:2012-06-19 05:36:38

标签: c++ boost multimap

我有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吗?

我想知道因为上面我略微简化了,实际上我可能需要检查的不只是0而且检查y参数可能需要稍微贵一些(数百万次查询)。

1 个答案:

答案 0 :(得分:2)

不,没有这样的保证或要求(在任何无序的关联容器上)。我建议在你的关键对象上添加一个“消毒”标志。