我有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
参数可能需要稍微贵一些(数百万次查询)。
答案 0 :(得分:2)
不,没有这样的保证或要求(在任何无序的关联容器上)。我建议在你的关键对象上添加一个“消毒”标志。