При поиске ключа в карте в C ++ STL выдает следующую ошибку - PullRequest
1 голос
/ 02 июля 2019

Я создал Карту с ключом в качестве строкового типа и связанным значением, сохраненным в векторе. Теперь у меня есть строка, и мне нужно проверить, присутствует ли каждый символ в строке в качестве ключа на карте.

#include <iostream>
#include <stdlib.h>
#include <vector>
#include <map>
#include <string>
using namespace std;

int main() {
   map<string, vector<string>> umap;
   umap["1"] = {"a","b","c"};
   umap["2"] = {"d","e","f"};
   string s = "23";
   for(int i=0; i<s.length(); i++) {
      if(umap.find(s[i]) != umap.end()) 
          cout<<"Present"<<endl;
      else
          cout<<"Not Present"<<endl;
      }
}

Ошибка:

main.cpp: In function ‘int main()’:
main.cpp:15:26: error: no matching function for call to ‘std::map<std::__cxx11::basic_string<char>, std::vector<std::__cxx11::basic_string<char> > >::find(__gnu_cxx::__alloc_traits<std::allocator<char> >::value_type&)’
         if(umap.find(s[i]) != umap.end())

1 Ответ

4 голосов
/ 02 июля 2019

Ошибка, возможно, немного загадочная.Позволяет перевести это в нечто читаемое человеком.

main.cpp: In function ‘int main()’:
main.cpp:15:26: error: no matching function for call to ‘std::map<std::__cxx11::basic_string<char>, std::vector<std::__cxx11::basic_string<char> > >::find(__gnu_cxx::__alloc_traits<std::allocator<char> >::value_type&)’
         if(umap.find(s[i]) != umap.end())

Первый std::__cxx11::basic_string<char> - сложный способ обозначить std::string.Тогда __gnu_cxx::__alloc_traits<std::allocator<char> >::value_type& - это еще более сложный способ обозначить тип возвращаемого значения s[i], который на самом деле просто char&.Сложив это вместе, мы получим

main.cpp: In function ‘int main()’:
main.cpp:15:26: error: no matching function for call to ‘std::map<std::string, std::vector<std::string> >::find(char&)’
         if(umap.find(s[i]) != umap.end())

Я надеюсь, теперь вы видите, что ошибка сообщает, что нет перегрузки find, которая бы принимала char& в качестве параметра.

Вместо этого вы должны передать std::string, например, через s.substr(i,1).

...