我在尝试使用STL地图时遇到了很多不同的问题,实在令人沮丧
所以我有很多问题:
首先我遇到了一些“<运算符未定义”的问题,但我不需要在我的地图中进行任何排序(为什么默认情况下任何人都需要这样做) 所以我发现unordered_map但我必须使用c ++ 11或其他东西,不知道它意味着什么 我不确定这是一个好主意,它是标准的吗?它是便携式的吗?
然后我得到了一些奇怪的错误:
/ usr / include / c ++ / 4.8 / bits / hashtable_policy.h:1070:12:错误:无效使用不完整类型'struct std :: hash< FOLVariable>”
那么为什么模板如此具有侵入性呢?我的意思是它应该充当一个容器,而不是关注对象的内容和内部的内容
任何人都可以帮我解决这个错误吗?
感谢
答案 0 :(得分:0)
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;
那么为什么模板如此具有侵入性呢?我的意思是它应该充当一个容器,而不是关注对象的内容和内部的内容
不同的容器与其包含的类型有不同的要求。例如,yhey都要求它们是可破坏的,因为容器负责管理它们的寿命。有些要求它们是可移动的;例如,vector
需要在分配更大的数组时移动元素以保持它们。关联容器对其键类型有额外的要求,以允许它们用作键。
答案 1 :(得分:0)
首先我遇到了一些“&lt;运算符未定义”的问题,但我不需要任何订购 地图(为什么任何人都会默认需要它)
std :: map是一个包含键值的排序关联容器 配有唯一键。使用比较对键进行排序 功能比较。
强调我的。默认情况下,比较函数为operator <
。
所以我找到了unordered_map,但我必须使用c ++ 11或其他东西,不知道它意味着什么,我不确定这是一个好主意,它是标准的吗?它是便携式的吗?
C ++ 11是最新C ++标准的名称。大多数现代编译器现在支持该标准的大多数主要功能。如果您的编译器支持它,那么使用您需要的功能是个好主意。它不是标准的C,但它是标准的C ++。
然后我得到了一些奇怪的错误:
/ usr / include / c ++ / 4.8 / bits / hashtable_policy.h:1070:12:错误:无效使用不完整类型'struct std :: hash&lt; FOLVariable&GT;”
std::unordered_map
是一个哈希表。默认情况下,用于std::unordered_map<Key, Value>
的散列函数是std::hash<Key>
的特化。您收到错误,因为您的类型FOLVariable
不存在此类专门化。