Нет соответствия для вызова '(std :: pair <unsigned int, unsigned int>) (unsigned int &, unsigned int)' - PullRequest
1 голос
/ 02 марта 2010

Я не знаю, что не так с следующим кодом, он должен читать числа и складывать их значение вместе с позицией в вектор пар, а затем сортировать их и распечатывать позиции. Я удалил часть с сортировкой - я думал, что проблема была там, но я получил ошибку при компиляции снова.

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

int main(void)
{
        unsigned int n,d,a[65],b[65],s,i,j,t,us=0;
        pair<unsigned int,unsigned int> temp;
        vector< pair<unsigned int,unsigned int> > v;
        cin >> n;
        for(i=0;i<n;i++)
        {
                cin >> t;
                temp(t, i+1);
                v.push_back(temp);
        }
        cin >> d;
        for(i=0;i<d;i++) cin >> a[i] >> b[i];
        for(i=0;i<v.size();i++)
        {
                cout << v[i].first << " -- " << v[i].second << endl;
        }
        return 0;
}

Пожалуйста, скажите мне, где проблема. Спасибо.

Ответы [ 2 ]

3 голосов
/ 02 марта 2010

Обычно неправильно создавать переменную вне цикла и многократно использовать ее в цикле, если единственное место, где вы ее используете, находится в этом цикле. Делайте это только в том случае, если стоимость строительства высока, и переназначить дешевле, чем воссоздать. Как правило, переменные C ++ должны объявляться в той области видимости, в которой они используются, чтобы было проще читать каждую часть программы и иметь возможность ее перефакторинга позже.

В вашем случае я бы полностью удалил ссылку на temp и изменил бы вызов push_back на v.push_back(make_pair(t, i+1)).

2 голосов
/ 02 марта 2010

Проблема temp(t, i+1);

Вам необходимо установить первое и второе вручную

temp.first = t;
temp.second = i + 1;

В качестве альтернативы вы можете объявить temp внутри цикла (вероятно, что бы я сделал).

for(i=0;i<n;i++) 
{ 
    cin >> t; 
    pair<unsigned int,unsigned int> temp(t, i+1); 
    v.push_back(temp); 
} 

Или второй вариант, используйте вспомогательную функцию make_pair и полностью покончите с темпом (спасибо KennyTM за напоминание)

for(i=0;i<n;i++) 
{ 
    cin >> t; 
    v.push_back(make_pair(t, i+1)); 
} 

Надеюсь, это поможет

...