Jac*_*ack 6 c++ stl c++11 unordered-multimap
std::unordered_multimap在处理迭代时,我想知道关键对象的唯一性.
我将尝试解释这一点:我需要将一些数据与地图中的密钥类型相关联,这些数据不应该被考虑在内Hash或KeyEqual元素中,但我需要它以避免与它一起存储单独的地图(出于优化目的) .
所以与我的想法相关的代码如下:
struct Key {
void* data;
mutable bool attribute;
Key(void* data) : data(data), attribute(false) { }
bool operator==(const Key& other) const {
return data == other.data;
}
};
struct KeyHash {
size_t operator()(const Key& key) const {
return std::hash<void*>()(key.data);
}
};
class Foo {
public:
int i;
Foo(int i) : i(i) { }
};
std::unordered_multimap<Key, Foo, KeyHash> map;
Run Code Online (Sandbox Code Playgroud)
问题产生于这样的事实,尽管这种方法很好,但是不能保证作为std::pair<const Key, Foo>映射到单个元素的第一个元素检索的密钥总是相同的.作为一个pair的const Key这听起来像在地图上的每一个元素都有其通过值的密钥副本,因此,如果我这样做
void* target = new int();
map.emplace(std::make_pair(target, Foo(1)));
map.emplace(std::make_pair(target, Foo(2)));
auto pit = map.equal_range(target);
pit.first->first.attribute = true;
std::cout << std::boolalpha << (++pit.first)->first.attribute << endl;
Run Code Online (Sandbox Code Playgroud)
这产生了false证实我的想法.因此,如果你有多个具有相同键的值(这是你想要的,因为你正在使用它std::unordered_map),确实存在大量浪费来存储键.
我没有看到任何其他解决方案,而不是类似的东西
struct Value
{
std::vector<Foo> foos;
bool attribute;
};
std::unordered_map<void*, Value> map;
Run Code Online (Sandbox Code Playgroud)
这允许我将属性与键配对,但是因为它需要使用两个级别的迭代器,所以一切都不那么干净.
还有其他我没有看到的解决方案吗?
23.5.5.1 类模板 unordered_multimap 概述 [unord.multimap.overview]
1 unordered_multimap 是一个无序关联容器,它支持等效键(unordered_multimap 的实例可能包含每个键值的多个副本),并将另一种类型mapped_type 的值与键相关联。unordered_multimap 类支持前向迭代器。
anunordered_multimap可能包含密钥的多个副本,如果您想要密钥的单个副本,那么 aunordered_map<K, vector<V>>可能更合适。
| 归档时间: |
|
| 查看次数: |
204 次 |
| 最近记录: |