вставка значений вектора в неупорядоченную карту - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь вставить значения, присутствующие в векторе, в unordered_map.Я передал вектор другой функции и объявил вектор unordered_map и итератор.Но при компиляции выдает ошибку (ниже).Я хотел бы понять, почему это не удается.Поиск в Интернете дал мне приблизительное представление о том, что может быть неправильным, но мне неясно:
1. Когда я передаю вектор без '&', копия вектора отправляется в функцию.Что это значит?Как это работает внутри?
2. Какие значения принимает make_pair?Разве 'n' и '* it' не должны быть простыми числовыми значениями, которые должна принимать make_pair?

#include<iostream>
#include<vector>
#include<unordered_map>
#include<algorithm>
using namespace std;

void readValues(vector<int>&v, int n)
{
    int temp;
    while(n--)
    {
        cin>>temp;
        v.push_back(temp);
    }
}

unordered_map<int, int> storeinhashmap(vector<int>v, int n)
{
    vector<int>::iterator it=v.begin();
    unordered_map<int,int>h;
    int temp;
    while(n--)
    {
        temp = *it;
        //cout<<"iter "<<*it<<" "<<++n<<endl;
        h.insert(make_pair<int,int>(n, *it));
        it++;
    }
    return h;
}



int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n, x;
        cin>>n;
        vector<int>v;
        readValues(v, n);
        cin>>x;
        unordered_map<int, int>h = storeinhashmap(v, n);
        //char ans = checksumisx(h, n);

    }
    return 0;
}

Ошибка -

harshit@harshit-5570:~/Desktop/geeksforgeeks$ g++ -std=c++14 key_pair.cpp 
key_pair.cpp: In function ‘std::unordered_map<int, int> storeinhashmap(std::vector<int>, int)’:
key_pair.cpp:26:43: error: no matching function for call to ‘make_pair(int&, int&)’
         h.insert(make_pair<int,int>(n, *it));
                                           ^
In file included from /usr/include/c++/5/bits/stl_algobase.h:64:0,
                 from /usr/include/c++/5/bits/char_traits.h:39,
                 from /usr/include/c++/5/ios:40,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from key_pair.cpp:1:
/usr/include/c++/5/bits/stl_pair.h:276:5: note: candidate: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_Tp>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&)
     make_pair(_T1&& __x, _T2&& __y)
     ^
/usr/include/c++/5/bits/stl_pair.h:276:5: note:   template argument deduction/substitution failed:
key_pair.cpp:26:43: note:   cannot convert ‘n’ (type ‘int’) to type ‘int&&’
         h.insert(make_pair<int,int>(n, *it));

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018
Какие значения принимает make_pair?Разве 'n' и '* it' не должны быть простыми числовыми значениями, которые должна принимать make_pair?

std::make_pair объявляется следующим образом (например, 20.3.3 в n3337):

template <class T1, class T2>
  pair<V1, V2> make_pair(T1&& x, T2&& y);

Таким образом, если мы явно установим эти параметры шаблона как вы, никаких вычетов типов не произойдет, и эта функция даст

pair<int, int> make_pair(int&& x, int&& y);

Тогда

h.insert(make_pair<int,int>(n, *it));

показывает ошибку компиляции, так как n и *it являются lvalues, а не int&&.Эта ошибка легко удаляется, если переписать эту строку следующим образом:

h.insert(make_pair<int,int>(std::move(n), std::move(*it)));

Но самый простой способ избежать этой ошибки - удалить явные параметры шаблона, такие как:

h.insert(make_pair(n, *it));
0 голосов
/ 15 декабря 2018

Поскольку вы не хотите изменять вектор, вы можете передать его как const ссылочный аргумент, чтобы избежать ненужных копий:

unordered_map<int, int> storeinhashmap(const vector<int>& v, int n)
{
    // Check that the number of elements to be inserted
    // is less than the size of vector
    if (n < 0 || n > v.size()) {
        throw invalid_argument("Wrong number of vector elements to be inserted.");
    }

    unordered_map<int,int>h;
    for (size_t i = 0; i < (size_t)n; i++) {
        h.insert(make_pair(n-i, v[i]));
    }
    return h;
}

Кроме того, я понял, что n - этоколичество элементов vector<int>, которые будут вставлены в unordered_map<int, int>, поэтому я включил предыдущую проверку размера.

...