hashmap映射,无序映射,类作为键
hashmaps maps, unordered maps, with classes as keys
我在尝试使用STL映射时会遇到很多不同的问题,这真的很令人沮丧
所以我有很多问题:
-
首先我遇到了一些问题<操作符未定义",但我不需要在我的映射中进行任何排序(为什么在默认情况下任何人都需要)我找到了unordered_map但我得用c++11之类的,不知道这是什么意思我不确定这是个好主意,它是标准c吗?>
-
然后我得到了一些奇怪的错误:
/usr/include/c++/4.8/bits/hashtable_policy.h:1070:12: error: invalid use of incomplete type ' struct std::hash
的
那么为什么模板如此具有侵入性呢?我的意思是,它应该充当一个容器,不管对象是什么,也不管它里面是什么
谁能帮我解决这个错误?谢谢
首先我遇到了一些"& lt;操作符未定义,但我不需要在我的映射(为什么在默认情况下需要它呢)
来自文档:
std::map是一个排序的关联容器,包含键值对具有唯一的密钥。键通过比较排序比较函数。
我特别强调。缺省情况下,比较函数为operator <
。
所以我找到了unordered_map,但我必须使用c++11或其他东西,不知道它是什么意思,我不确定这是一个好主意,它是标准c吗?可携带吗?
c++ 11是最新的c++标准的名称。到目前为止,大多数现代编译器都支持该标准的大多数主要特性。如果您的编译器支持它,那么使用您需要的特性是一个好主意。它不是标准的C,但它是标准的c++。
然后我得到了一些奇怪的错误:
/usr/include/c++/4.8/bits/hashtable_policy.h:1070:12: error: invalid use of incomplete type ' struct std::hash
'
std::unordered_map
是一个哈希表。默认情况下,std::unordered_map<Key, Value>
使用的散列函数是std::hash<Key>
的专门化。您会得到这个错误,因为您的类型FOLVariable
不存在这样的专门化。
map
按键存储元素;所以你需要定义排序。
如果键是类类型,您可以重载operator<
,使std::less
的默认顺序工作:
bool operator<(my_thing const & a, my_thing const & b) {
// return true if "a" is ordered before "b"
}
std::map<my_thing, something_else> my_map;
或者您可以提供自己的比较函子
struct compare_my_thing {
bool operator()(my_thing const & a, my_thing const & b) {
// return true if 'a' is ordered before 'b'
}
};
std::map<my_thing, something_else, compare_my_thing> my_map;
unordered_map
是一个哈希表;因此,您需要定义散列函数和比较是否相等的方法(因为散列通常不是唯一的)。同样,您可以提供重载,以便缺省值(std::hash
和std::equal_to
)可以工作:
namespace std {
template <>
struct hash<my_thing> {
std::size_t operator()(my_thing const & t) const {
// return hash of 't'
}
};
}
bool operator==(my_thing const & a, my_thing const & b) {
// return true if 'a' and 'b' are equal
}
std::unordered_map<my_thing, something_else> my_map;
或者可以提供自己的函子
struct hash_my_thing {
std::size_t operator()(my_thing const & t) const {
// return hash of 't'
}
};
struct compare_my_thing {
bool operator()(my_thing const & a, my_thing const & b) {
// return true if 'a' and 'b' are equal
}
};
std::unordered_map<my_thing, something_else, hash_my_thing, compare_my_thing> my_map;
那么为什么模板如此具有侵入性呢?我的意思是,它应该充当一个容器,不管对象是什么,也不管它里面是什么
不同的容器对其所包含的类型有不同的要求。例如,它们都要求容器是可破坏的,因为容器负责管理它们的生命周期。有些要求它们是可移动的;例如,vector
在分配更大的数组时需要移动元素来保存它们。关联容器对它们的键类型有额外的要求,以允许它们被用作键。
- 递归无序映射
- 正在将无序映射设置为无序映射的值
- 智能指针作为无序映射键,并通过引用进行比较
- 打印无序映射的第二个元素,即集合
- 由并发无序映射查找线程调用的函数是否安全?
- 如何按值对无序哈希映射进行排序
- 将大数字(10-12 位数字)存储在无序映射中<字符串,整数>
- 使用无序映射在STL中存储键值对
- 为C++中的无序映射获取给定输入键的错误值
- 将大型对象存储在无序映射中是否效率低下
- 在无序映射的结构化绑定中推导类型
- 使用无序映射进行错误索引
- 将一个向量对放在一个无序映射与一个映射中
- 如何在c++中修改无序映射中的每个值
- C++:使用一对(cpp_int,int)整数作为无序映射中的键(其中cpp_int是boost多精度整数)
- 将 [] 索引到无序映射时出现段错误
- 以std::字符串作为关键字,按字典顺序对一个无序映射进行排序
- 无序映射存储桶的节点大小
- 在无序映射<字符串上使用 find(),向量<string>>与 C++ 中的有序映射花费相同的时间
- 以三个无符号字符为关键字的无序映射