如何在字符串数组中找到地图的键?

Posted

技术标签:

【中文标题】如何在字符串数组中找到地图的键?【英文标题】:How to find the keys of a map within a string array? 【发布时间】:2021-02-18 12:38:58 【问题描述】:

您好,一旦在字符串数组中找到相应的键,我正在尝试将映射的值添加到名为“total”的 int 变量中。例如,“aab”总共给出 5,“bbc”总共给出 7。我尝试运行代码,但它不起作用。相反,我得到了以下错误:

C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c++/bits/stl_map.h:1221:2: note:   template argument deduction/substitution failed:
C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c++/bits/stl_map.h: In substitution of 'template<class _Kt> decltype (((const std::map<char, int>*)this)->std::map<char, int>::_M_t.std::_Rb_tree<char, std::pair<const char, int>, std::_Select1st<std::pair<const char, int> >, std::less<char>, std::allocator<std::pair<const char, int> > >::_M_count_tr<_Kt, _Req>(__x)) std::map<char, int>::count<_Kt>(const _Kt&) const [with _Kt = std::__cxx11::basic_string<char>]':
Maps1.cpp:34:29:   required from here
C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c++/bits/stl_map.h:1221:2: error: no matching function for call to 'std::_Rb_tree<char, std::pair<const char, int>, std::_Select1st<std::pair<const char, int> >, std::less<char>, std::allocator<std::pair<const char, int> > >::_M_count_tr(const std::__cxx11::basic_string<char>&) const'
In file included from C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c++/map:60,
                 from Maps1.cpp:1:
C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c++/bits/stl_tree.h:1250:2: note: candidate: 'template<class _Kt, class _Req> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::size_type std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_count_tr(const _Kt&) const [with _Kt = _Kt; _Req = _Req; _Key = char; _Val = std::pair<const char, int>; _KeyOfValue = std::_Select1st<std::pair<const char, int> >; _Compare = std::less<char>; _Alloc = std::allocator<std::pair<const char, int> >]'
  _M_count_tr(const _Kt& __k) const
  ^~~~~~~~~~~
C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c++/bits/stl_tree.h:1250:2: note:   template argument deduction/substitution failed:
C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c++/bits/stl_tree.h:1247:9: error: no type named 'type' in 'struct std::__has_is_transparent<std::less<char>, std::__cxx11::basic_string<char>, void>'
         typename _Req =
         ^~~~~~~~
Maps1.cpp:35:21: error: no match for 'operator[]' (operand types are 'std::map<char, int>' and 'std::__cxx11::string' aka 'std::__cxx11::basic_string<char>')
     total += hashMap[array[j]];
                     ^
In file included from C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c++/map:61,
                 from Maps1.cpp:1:
C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c++/bits/stl_map.h:490:7: note: candidate: 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const key_type&) [with _Key = char; _Tp = int; _Compare = std::less<char>; _Alloc = std::allocator<std::pair<const char, int> >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = int; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = char]'
       operator[](const key_type& __k)
       ^~~~~~~~
C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c++/bits/stl_map.h:490:7: note:   no known conversion for argument 1 from 'std::__cxx11::string' aka 'std::__cxx11::basic_string<char>' to 'const key_type&' aka 'const char&'
C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c++/bits/stl_map.h:510:7: note: candidate: 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](std::map<_Key, _Tp, _Compare, _Alloc>::key_type&&) [with _Key = char; _Tp = int; _Compare = std::less<char>; _Alloc = std::allocator<std::pair<const char, int> >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = int; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = char]'
       operator[](key_type&& __k)
       ^~~~~~~~
C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c++/bits/stl_map.h:510:7: note:   no known conversion for argument 1 from 'std::__cxx11::string' aka 'std::__cxx11::basic_string<char>' to 'std::map<char, int>::key_type&&' aka 'char&&'

我做了类似的事情,但使用单个字符串而不是字符串数组,并且它有效。 我是一个完整的C++初学者,我很困惑。请有人解释这个错误的原因并给我一个替代解决方案。非常感谢您的时间和精力。我的代码如下所示:

#include <map>
#include <iostream> 
#include <string> 
using namespace std; 
  
int main()
     map<char, int> hashMap;
     string array[] = "aab", "ab", "bbc", "cab";
     hashMap['a'] = 1;
     hashMap['b'] = 3;
     hashMap['c'] = 1;
     int total = 0;
     for(int i = 0; i < array.size(); i++)
         for(int j = 0; j < array[i].size(); j++)
            if(hashMap.find(array[j]) != hashMap.end())
                   total += hashMap[array[j]];
         
     
  
  cout << total;

【问题讨论】:

find(array[i][j]) 或用于避免索引的范围:for (const auto&amp; s : array) for (char c : s) total += hashMap[c]; 【参考方案1】:
map<char, int> hashMap;

您的变量名非常混乱。 std::map 不是哈希图。

string array[] = "aab", "ab", "bbc", "cab";
...
for(int i = 0; i < array.size(); i++)

这里的问题是数组没有成员函数。然而,您正试图在数组上调用成员函数 size

您可以改用std::size

for(int i = 0; i < std::size(array); i++)

或者您可以使用 range-for 循环以获得更好的可读性:

 for(auto& str : array) 
     for(char c : str) 

还有一个潜在的命名混淆,因为您使用 using namespace std; 隐藏了您引入全局命名空间的标准名称 std::array 不要使用 using namespace std;

if(hashMap.find(array[j]) != hashMap.end())
   total += hashMap[array[j]];

这里的问题是您的地图键是char,但您正在尝试搜索字符串。我怀疑您打算写array[i][j] - 如果您使用建议的范围,请仅使用c

此外,进行两次查找会不必要地低效。存储迭代器,这样您就可以从中获取值而无需再次查找:

auto it = hashMap.find(array[i][j]);
if(it != hashMap.end())
    total += it->second;

【讨论】:

for-range 似乎比std::size(array) 更好:-) @Jarod42 好点。添加到答案中。

以上是关于如何在字符串数组中找到地图的键?的主要内容,如果未能解决你的问题,请参考以下文章

如何在胶合时分离(带有空格)字符串,使用数组中的键来检查它是否粘合?

如何迭代由json对象中的键访问的数组[重复]

在颤动中 - 我如何最好地处理和分配预先确定的键给 json 中的嵌套列表/数组

如何检查我的哈希是否有来自字符串数组的键?

如何在 PHP 中的键 => 值对数组中获取最小值、最大值和平均值?

php数组的重复值如何过滤掉