gpt4 book ai didi

c++ - 我可以将对象插入 tr1 unordered_map 吗

转载 作者:行者123 更新时间:2023-11-30 02:06:56 25 4
gpt4 key购买 nike

我有大量数据要用 C++ 处理,发现 unordered_map 工作效率很高但是,没有在unorderd_map 中存储对象的示例。当我自己尝试时,它无法遵守。

首先我包含 unordered_map

#include <tr1/unordered_map>

然后定义类型

typedef std::tr1::unordered_map<Vector3f, Vector3f> vectorMap;

这里的 Vector3f 是我创建的类。当我在上面编译时,它不会返回任何错误。但是当我添加

vectorMap _map; 
Vector3f v1,v2,v3;
_map.insert(std::make_pair(v1,v2));

complier 返回了一大段错误,请问是我插入pair的时候有问题,还是unsorted不支持插入object,如果不支持,还有其他有效的存储和搜索object pairs的方法吗就像 JAVA 中的 hashmap。以下是编译器中的错误信息报告:

In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/string:50,
from /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/locale_classes.h:42,
from /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/ios_base.h:43,
from /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/ios:43,
from /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/ostream:40,
from /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/iostream:40,
from homework1.cc:1:
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/stl_function.h: In member function ‘bool std::equal_to<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Vector3f]’:
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/tr1_impl/hashtable_policy.h:769: instantiated from ‘bool std::tr1::__detail::_Hash_code_base<_Key, _Value, _ExtractKey, _Equal, _H1, _H2, std::tr1::__detail::_Default_ranged_hash, false>::_M_compare(const _Key&, size_t, std::tr1::__detail::_Hash_node<_Value, false>*) const [with _Key = Vector3f, _Value = std::pair<const Vector3f, Vector3f>, _ExtractKey = std::_Select1st<std::pair<const Vector3f, Vector3f> >, _Equal = std::equal_to<Vector3f>, _H1 = std::tr1::hash<Vector3f>, _H2 = std::tr1::__detail::_Mod_range_hashing]’
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/tr1_impl/hashtable:918: instantiated from ‘std::tr1::__detail::_Hash_node<_Value, __cache_hash_code>* std::tr1::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_find_node(std::tr1::__detail::_Hash_node<_Value, __cache_hash_code>*, const _Key&, typename std::tr1::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Hash_code_type) const [with _Key = Vector3f, _Value = std::pair<const Vector3f, Vector3f>, _Allocator = std::allocator<std::pair<const Vector3f, Vector3f> >, _ExtractKey = std::_Select1st<std::pair<const Vector3f, Vector3f> >, _Equal = std::equal_to<Vector3f>, _H1 = std::tr1::hash<Vector3f>, _H2 = std::tr1::__detail::_Mod_range_hashing, _Hash = std::tr1::__detail::_Default_ranged_hash, _RehashPolicy = std::tr1::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true]’
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/tr1_impl/hashtable:983: instantiated from ‘std::pair<typename std::tr1::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::iterator, bool> std::tr1::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_insert(const _Value&, std::tr1::true_type) [with _Key = Vector3f, _Value = std::pair<const Vector3f, Vector3f>, _Allocator = std::allocator<std::pair<const Vector3f, Vector3f> >, _ExtractKey = std::_Select1st<std::pair<const Vector3f, Vector3f> >, _Equal = std::equal_to<Vector3f>, _H1 = std::tr1::hash<Vector3f>, _H2 = std::tr1::__detail::_Mod_range_hashing, _Hash = std::tr1::__detail::_Default_ranged_hash, _RehashPolicy = std::tr1::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true]’
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/tr1_impl/hashtable:420: instantiated from ‘typename __gnu_cxx::__conditional_type<__unique_keys, std::pair<std::tr1::__detail::_Hashtable_iterator<_Value, __constant_iterators, __cache_hash_code>, bool>, std::tr1::__detail::_Hashtable_iterator<_Value, __constant_iterators, __cache_hash_code> >::__type std::tr1::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::insert(const _Value&) [with _Key = Vector3f, _Value = std::pair<const Vector3f, Vector3f>, _Allocator = std::allocator<std::pair<const Vector3f, Vector3f> >, _ExtractKey = std::_Select1st<std::pair<const Vector3f, Vector3f> >, _Equal = std::equal_to<Vector3f>, _H1 = std::tr1::hash<Vector3f>, _H2 = std::tr1::__detail::_Mod_range_hashing, _Hash = std::tr1::__detail::_Default_ranged_hash, _RehashPolicy = std::tr1::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true]’
homework1.cc:181: instantiated from here
/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/stl_function.h:203: error: no match for ‘operator==’ in ‘__x == __y’

这是 Vector3f 类

class Vector3f {

float _item[3];

public:

float & operator [] (int i) {
return _item[i];
}

Vector3f(float x, float y, float z)
{ _item[0] = x ; _item[1] = y ; _item[2] = z; };

Vector3f() {};


Vector3f & operator = (Vector3f & obj)
{
_item[0] = obj[0];
_item[1] = obj[1];
_item[2] = obj[2];

return *this;
};

Vector3f & operator += (Vector3f & obj)
{
_item[0] += obj[0];
_item[1] += obj[1];
_item[2] += obj[2];

return *this;
};
};

最佳答案

确保您的 Vector3f类有一个可访问的平等operator== ,那std::hash<Vector3f>已定义。

对于前者,您可能应该只使用成员函数:

struct Vector3f
{
bool operator==(Vector3f const & rhs) const { /* ... */ }
//...
};

严格来说,您只需要 std::equal_to<Vector3f>已定义,但为您的类提供相等运算符是实现此目的最明智的方法。

关于c++ - 我可以将对象插入 tr1 unordered_map 吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8368318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com