【问题标题】:issues with c++ unordered_mapc++ unordered_map 的问题
【发布时间】:2013-12-26 06:01:33
【问题描述】:

我正在为编码面试做准备,所以我一直在一个网站上编写一些 c++ 代码,该网站有很多示例问题。当尝试在网站上编译我的代码时(不确定网站在后台运行什么编译器版本),我得到一个非常奇特的 unordered_map 错误。我以前从未遇到过这个问题,我做了一些研究,发现错误是由于我如何初始化我的 unordered_map 而发生的。在初始化我的 unordered_map 时,我使用 c++ 字符串作为我的键和值,由于某种原因,编译器不喜欢这样。编译器一直说“basic_string”没有哈希函数,但我没有使用 basic_string,我使用的是 c++ 字符串

#include <cstdlib>
#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;

void typeahead(const vector<string> &usernames, const vector<string> &queries) {

//error occurs right here at this initialization 
//of HistoryHash
unordered_map<string, string> HistoryHash;
unordered_map<string, string>::iterator it;
string cur_query, cur_usrnm;
locale loc;
//------------------------------------
//rest of code irrelevant

这是完整/完整的错误:

In file included from /usr/include/c++/4.7/unordered_map:45:0,
                 from user_file.cpp:6:
/usr/include/c++/4.7/bits/hashtable.h: In instantiation of 'void std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::insert(_InputIterator, _InputIterator) [with _InputIterator = std::basic_string<char>; _Key = std::basic_string<char>; _Value = std::pair<const std::basic_string<char>, std::basic_string<char> >; _Allocator = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >; _ExtractKey = std::_Select1st<std::pair<const std::basic_string<char>, std::basic_string<char> > >; _Equal = std::equal_to<std::basic_string<char> >; _H1 = std::hash<std::basic_string<char> >; _H2 = std::__detail::_Mod_range_hashing; _Hash = std::__detail::_Default_ranged_hash; _RehashPolicy = std::__detail::_Prime_rehash_policy; bool
__cache_hash_code = true; bool __constant_iterators = false; bool __unique_keys = true]':
user_file.cpp:56:52:   required from here
/usr/include/c++/4.7/bits/hashtable.h:1410:61: error: no matching function for call to '__distance_fw(std::basic_string<char>&, std::basic_string<char>&)'
/usr/include/c++/4.7/bits/hashtable.h:1410:61: note: candidates are:
In file included from /usr/include/c++/4.7/bits/hashtable.h:36:0,
                 from /usr/include/c++/4.7/unordered_map:45,
                 from user_file.cpp:6:
/usr/include/c++/4.7/bits/hashtable_policy.h:44:5: note: template<class _Iterator> typename std::iterator_traits::difference_type std::__detail::__distance_fw(_Iterator, _Iterator, std::input_iterator_tag)
/usr/include/c++/4.7/bits/hashtable_policy.h:44:5: note:
template argument deduction/substitution failed:
In file included from /usr/include/c++/4.7/unordered_map:45:0,
                 from user_file.cpp:6:
/usr/include/c++/4.7/bits/hashtable.h:1410:61: note:   candidate expects 3 arguments, 2 provided
In file included from /usr/include/c++/4.7/bits/hashtable.h:36:0,
                 from /usr/include/c++/4.7/unordered_map:45,
                 from user_file.cpp:6:
/usr/include/c++/4.7/bits/hashtable_policy.h:50:5: note: template<class _Iterator> typename std::iterator_traits::difference_type std::__detail::__distance_fw(_Iterator, _Iterator, std::forward_iterator_tag)
/usr/include/c++/4.7/bits/hashtable_policy.h:50:5: note:   template argument deduction/substitution failed:
In file included from /usr/include/c++/4.7/unordered_map:45:0,
from user_file.cpp:6:
/usr/include/c++/4.7/bits/hashtable.h:1410:61: note:   candidate expects 3 arguments, 2 provided
In file included from /usr/include/c++/4.7/bits/hashtable.h:36:0,
                 from /usr/include/c++/4.7/unordered_map:45,
                 from user_file.cpp:6:
/usr/include/c++/4.7/bits/hashtable_policy.h:56:5: note: template<class _Iterator> typename std::iterator_traits::difference_type std::__detail::__distance_fw(_Iterator, _Iterator)
/usr/include/c++/4.7/bits/hashtable_policy.h:56:5: note:   template argument deduction/substitution failed:
/usr/include/c++/4.7/bits/hashtable_policy.h: In substitution of 'template<class _Iterator> typename std::iterator_traits::difference_type std::__detail::__distance_fw(_Iterator, _Iterator) [with _Iterator = std::basic_string<char>]':
/usr/include/c++/4.7/bits/hashtable.h:1410:61:   required from 'void std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::insert(_InputIterator, _InputIterator) [with _InputIterator = std::basic_string<char>; _Key = std::basic_string<char>; _Value = std::pair<const std::basic_string<char>, std::basic_string<char> >; _Allocator = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >; _ExtractKey = std::_Select1st<std::pair<const std::basic_string<char>, std::basic_string<char> > >; _Equal = std::equal_to<std::basic_string<char> >; _H1 = std::hash<std::basic_string<char> >; _H2 = std::__detail::_Mod_range_hashing; _Hash = std::__detail::_Default_ranged_hash; _RehashPolicy = std::__detail::_Prime_rehash_policy; bool __cache_hash_code = true; bool __constant_iterators = false; bool __unique_keys = true]'
user_file.cpp:56:52:   required from here
/usr/include/c++/4.7/bits/hashtable_policy.h:56:5: error: no type named 'difference_type' in 'struct std::iterator_traits<std::basic_string<char> >'
In file included from /usr/include/c++/4.7/unordered_map:45:0,
                 from user_file.cpp:6:
/usr/include/c++/4.7/bits/hashtable.h: In instantiation of 'void std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::insert(_InputIterator, _InputIterator) [with _InputIterator = std::basic_string<char>; _Key = std::basic_string<char>; _Value = std::pair<const std::basic_string<char>, std::basic_string<char> >; _Allocator = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >; _ExtractKey = std::_Select1st<std::pair<const std::basic_string<char>, std::basic_string<char> > >; _Equal = std::equal_to<std::basic_string<char> >; _H1 = std::hash<std::basic_string<char> >; _H2 = std::__detail::_Mod_range_hashing; _Hash = std::__detail::_Default_ranged_hash; _RehashPolicy = std::__detail::_Prime_rehash_policy; bool __cache_hash_code = true; bool __constant_iterators = false; bool __unique_keys = true]':
user_file.cpp:56:52:   required from here
/usr/include/c++/4.7/bits/hashtable.h:1418:2: error: no match for 'operator++' in '++__first'
/usr/include/c++/4.7/bits/hashtable.h:1419:4: error: no match for 'operator*' in '*__first'"

【问题讨论】:

  • 那个sn-p的错误几乎没用。这都是为了一个实例化信息。请显示整个错误,或至少显示实际的错误消息。
  • 您应该尝试将其减少为重现问题的最小代码示例。您的大部分代码似乎无关紧要。
  • 我说错误发生在 unordered_map 初始化但我可以编辑它并减少它
  • std::stringstd::wstringtypedef 来自 std::basic_string
  • 我刚刚进行了编辑,现在应该更清楚了。

标签: c++ stl unordered-map


【解决方案1】:

这行看起来不对:

 HistoryHash.insert(cur_query, local_min);

std::unordered_map&lt;std::string, std::string&gt;::insert 没有重载,它需要两个字符串。想必你想要

HistoryHash.insert(std::make_pair(cur_query, local_min));

【讨论】:

  • 是的,我注意到了,但那条线不是我主要错误的原因。在我初始化 unordered_map 的地方发生了严重的错误
  • @AyBayBay 你试过删除那行吗?它为我编译,所以你的标准库可能不完全兼容。
  • 这似乎可以解决问题,感谢您的帮助。我不敢相信这条线会造成如此严重的错误 c++ 真的很糟糕!
猜你喜欢
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2023-04-04
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多