строка карты и вектор, как использовать поиск - PullRequest
2 голосов
/ 12 февраля 2020

Мне нужно сгенерировать вектор векторов, начинающийся со слова.

Далее я привел минимальный пример с одной буквой (хотя позже мне следует использовать более длинные слова) того, что мне нужно сделать. К сожалению, я не понимаю, как функция «найти» должна работать для карты, и я получаю ошибку компиляции. Любая помощь, пожалуйста?

#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

vector <vector <double> > assign_mat(string &s, map<string, vector<double> > &amatr){
  vector <vector <double> > res;

  for(size_t i=0; i<s.size(); ++i){
    res.push_back(amatr.find(s[i])->second)  ;

  }

  return res;
}


int main(){

map<string, vector<double> > amm_vals =     {
{"S", {-0.228,1.399,-4.760,0.670,-2.647} },
{"T", {-0.032,0.326,2.213,0.908,1.313} },
{"V", {-1.337,-0.279,-0.544,1.242,-1.262} }
                            };

string s="V";
vector <vector <double> > ares;

ares=assign_mat(s, amm_vals);
return 0;
}

Я получаю следующую ошибку:

В функции 'std::vector<std::vector<double> > assign_mat(std::__cxx11::string&, std::map<std::__cxx11::basic_string<char>, std::vector<double> >&)':
main_code. cpp: 15: 34: ошибка: нет подходящей функции для вызова 'std::map<std::__cxx11::basic_string<char>, std::vector<double> >::find(__gnu_cxx::__alloc_traits<std::allocator<char> >::value_type&)' res.push_back(amatr.find(s[i])->second) ;

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Если вы следуете рекомендациям @SamVarshavchik, ваш код должен выглядеть следующим образом:

 vector <vector <double> > assign_mat(string &s, map<string, vector<double> > &amatr){
     vector <vector <double> > res;
     for(size_t i=0; i<s.size(); ++i){
         if(amatr.find(string(1, s[i])) != amatr.end())
             res.push_back(amatr[string(1, s[i])]);
     }
     return res;
}

Но я думаю, что лучше использовать следующую идею:

vector <vector <double> > assign_mat(vector<string> &s, map<string, vector<double> > &amatr){
    vector <vector <double> > res;
    for(size_t i=0; i<s.size(); ++i){
        if(amatr.find(s[i]) != amatr.end())
            res.push_back(amatr[s[i]]);
    }
    return res;
}

И помните, что find в библиотеке std возвращает итератор для первого элемента в диапазоне [first, last), который сравнивается с val. Если такой элемент не найден, функция возвращает последнее.

2 голосов
/ 12 февраля 2020

Я думаю, что вы пытаетесь добавить все значения из amm_vals, у которых есть ключи, равные одному символу s? Если это так, то вы можете преобразовать s[i] в строку, объединяя ее в пустую строку.

std::vector<std::vector<double>> assign_mat(const std::string &s, std::map<std::string, std::vector<double>> &amatr){
  std::vector<std::vector<double>> res;

    for ( size_t i = 0; i < s.size(); ++i ) {
        std::string _s = s[i] + std::string{}; // or std::string _s( 1, s[i] );
        auto _where = amatr.find( _s );
        if ( _where != amatr.end() )
            res.push_back( _where->second );
    }

  return res;
}
...