调用'(std :: pair <unsigned int,=“”unsigned =“”int =“”>)(unsigned int&amp;,unsigned int)'</unsigned>

时间:2010-03-02 13:22:23

标签: c++ vector std-pair

我不知道下面的代码有什么问题,它应该读取数字并将它们的值与位置放在一起,然后对它们进行排序并打印出位置。我删除了排序部分 - 我认为问题存在,但我再次收到编译错误。

#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 个答案:

答案 0 :(得分:3)

在循环外创建变量并在循环中重复使用它通常是不好的形式,如果你使用它的唯一地方是在那个循环中。只有在施工成本高且重新分配比重新分配更便宜时才这样做。通常,C ++变量应该在它们使用的范围内声明,以便更容易阅读程序的每个部分,并能够在以后重新考虑它。

在您的情况下,我会完全删除对temp的引用,并将push_back调用更改为v.push_back(make_pair(t, i+1))

答案 1 :(得分:2)

问题是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帮助函数,完全取消temp(感谢KennyTM提醒)

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

希望这有帮助