Как добавить значения к вектору на карте C ++ - PullRequest
0 голосов
/ 29 сентября 2019

у меня multimap<string,vector<int>,int> hello.Я пытаюсь insert значение hello, но у меня появляется ошибка: No matching member function for call to 'insert'

Я думаю, что есть проблема с векторной частью, но я не могу понять, что именно,


#include <iostream>
#include <sstream>
#include <cstdlib>
#include <string>
#include <vector>
#include <map>

using namespace std;

void addSpace(string &gendata, string &target){
    int size = static_cast<int>(gendata.length());

    for (int i = 0; i < size; i++){
        target += gendata[i];
        // check i for (i < gendata.length() - 1) !!!
        if (i < gendata.length() - 1 && isdigit(gendata[i]) && isalpha(gendata[i + 1])){
            target += ' ';
        }
    }
}

std::vector<int> make_vector(int a, int b, int c, int d) {
    std::vector<int> result;
    result.push_back(a);
    result.push_back(b);
    result.push_back(c);
    result.push_back(d);
    return result;
}


int main(int argc, const char * argv[]) {
    multimap<string,pair<string,int>> student;
    multimap<string,vector<int>,int> hello;
    multimap<string,pair<string,int>>::iterator itr;
    string s, gendata, target, word, name, subject;
    int mark=0, i=0;

    target = "Aurora Physics 55 Lily Biology 81 Dylan Physics 62 Bella Physics 58 Jaxon Physics 85 Noah Chemistry 98 Jaxon Mathematics 54 Michael Chemistry 98 Charlotte Mathematics 92 Penelope Mathematics 95 Ellie Physics 93";

    istringstream iss(target);

    int count = 0;
    while(iss >> word){
        if(count == 0){
            name = word;
            count++;
        }
        else if (count == 1){
            subject = word;
            count++;
        }else if (count == 2){
            mark = stoi(word);
            student.insert({name,{subject,mark}});
            count = 0;
        }
    }

    string rememberName;
    int bio=0, phys=0, chem=0, maths=0, sum=0;
    for (itr = student.begin() ; itr != student.end() ; itr++) {
        bio=0; phys=0; chem=0; maths=0;

        rememberName = itr->first;
        while (rememberName == itr->first) {
            if (itr->second.first == "Biology") {
                bio = itr->second.second;
            }else if(itr->second.first == "Physics"){
                phys = itr->second.second;
            }else if(itr->second.first == "Chemistry"){
                chem = itr->second.second;
            }else{
                maths = itr->second.second;
            }
            itr++;
        }
        itr--;
        sum = bio+phys+chem+maths;
        // this is where I have a problem 
        hello.insert({rememberName,{make_vector(bio,phys,chem,maths)},sum});

    }
}

Я бы хотел вставить вектор в hello карту.

1 Ответ

0 голосов
/ 29 сентября 2019

Ваша декларация hello неверна.У вас не может быть трех типов по отношению друг к другу.

Глядя на документацию, std::multimap имеет 4 аргумента шаблона:

  • Key
  • T (он же тип значения)
  • Compare - тип, для которого operator() будет вызываться для сравнения элементов карты.Должен быть типом функтора (указатель на функцию, лямбда, класс с перегруженным operator()).По умолчанию std::less<Key>
  • Allocator - нам это не интересно.

Когда вы объявляете std::multimap следующим образом:

multimap<string,vector<int>,int> hello;

высообщая компилятору, что он должен сравнить ключи на int с.Это не имеет никакого смысла - при вставке или поиске элементов в карте компилятор должен будет попытаться вызвать int(std::string, std::string) и ожидать результат типа bool, а это невозможно.


Почему вы хотите хранить дополнительные int здесь?Вы можете рассчитать его в любое время из vector, который у вас есть на карте.Наилучшим решением IMHO было бы не повторяться и использовать std:multimap<std::string, std::vector<int>> hello

. Если вы действительно хотите хранить sum, а также vector, вы должны каким-то образом объединить их в один тип.Вы можете использовать std::pair<std::string, std::pair<std::vector<int>, int>>, но это довольно глубоко вложено.Вы также можете push_back суммировать как последний элемент вектора для примера, но это делает задачу вектора довольно неясной (некоторые значения там представляют оценки, и одно из них является суммой оценок?)

...