在C ++中使用pair

时间:2012-11-14 16:52:59

标签: c++ stl

有人可以告诉我为什么我无法编译以下程序:

#include<iostream>
#include<string>
#include<cmath>
#include<iostream>
#include<cfloat>
#define MOD 10000009

using namespace std;

double distance(pair<int,int> p1,pair<int,int> p2)
{
    double dist;
    dist = sqrt( (p1.first-p2.first)*(p1.first-p2.first) + (p1.second-p2.second)*(p1.second-p2.second) );
    return(dist);
}

int main()
{
        int N,i,j;
        cin >> N;
        pair<int,int> pi[N];
        for(i=0;i<N;i++)
        {
            cin >> pi[i].first >> pi[i].second;
        }

        for(i=0;i<N;i++)
        {
            cout << pi[i].first << " "<< pi[i].second << endl;
        }

        distance(pi[0],pi[1]); // This line is giving error

    return 0;
}

enter image description here

5 个答案:

答案 0 :(得分:6)

distance由标准库定义,您已经using加入到全局命名空间中,所以它试图使用那个而不是您编写的那个(和期望的)。

调用您的函数以避免名称冲突。

同样的样式注释,在C ++代码#define中通常可以用const或内联函数替换以提供更大的类型安全性,我喜欢为我需要的每个项目编写using std::cout等而不是using namespace std

答案 1 :(得分:5)

您的代码至少存在3个问题,使其不合法C ++。有问题的是:

distance(pi[0],pi[1]); // This line is giving error

标准库中有distance,编译器正在解析调用此标准库。这是因为您using namespace std。最好不要using namespace std,尤其是在标题中,但正如您所看到的那样,它也会导致问题。

有一些潜在的解决方案。

  1. 删除using namespace std并限定您对标准库对象的所有使用(例如std::cin
  2. using namespace std替换为特定的使用声明,仅引入您实际使用的StdLib中的那些部分(如using std::cin
  3. 更改距离调用以明确引用全局命名空间:::distance(...);
  4. 编辑此外,这不是合法的C ++:

    int N,i,j;
    cin >> N;
    pair<int,int> pi[N];
    

    标准C ++只允许在编译时知道大小时声明C样式数组。您可能正在使用gcc工具来构建它,这就是它不会导致错误的原因。但是,您使用的是GCC特定的语言扩展,动态大小的数组,并且您编写的代码不是C ++语言本身的一部分。

答案 2 :(得分:2)

John Dibling对这个问题给出了很好的解释,但即使删除using namespace std;也不够,因为距离是在同一个头中定义的,它会被解析为计算两个迭代器之间距离的函数。

我认为这是C ++中你想要实现的最小重写

#include <iostream>
#include <utility>
#include <vector>

typedef std::pair<int,int> intPair;
typedef std::vector<intPair> vectorPairs;

double Distance2D(const intPair& p1, const intPair& p2)
{
    double dist;
    dist = sqrt( (p1.first-p2.first)*(p1.first-p2.first) + (p1.second-p2.second)*(p1.second-p2.second) );
    return(dist);
}

int main()
{
    int numEntries;
    std::cin >> numEntries;
    vectorPairs pairs(numEntries);
    for(vectorPairs::iterator itor = pairs.begin(); itor != pairs.end(); ++itor)
    {
        std::cin >> itor->first >> itor->second;
    }
    for(vectorPairs::iterator itor = pairs.begin(); itor != pairs.end(); ++itor)
    {
        std::cout << itor->first << " " << itor->second << std::endl;
    }

    if(pairs.size() >= 2) // need to validate that 0 and 1 and within the range of pairs
    {
        double dist = Distance2D(pairs.at(0), pairs.at(1)); 
        std::cout << dist;
    }
    return 0;
}

答案 3 :(得分:0)

在C ++中使用pair

pair<some_datatype, some_other_datatype> my_pairs;

上面一行将使第一个元素成对第二个元素,现在你可以使用这一对 像这样:

pair<int,int> my_pairs;
my_pairs  = make_pair(5,6);
cout<<my_pairs.first<<" "<<my_pairs.second<<endl;

现在说你要创建一个“n&#34;”的列表(或数组或向量)对,要做到这一点,我们可以使用矢量数据结构 像这样:

typedef pair<some_datatype,some_other_datatype> my_pairs;
vector<my_pairs> v;

for(int i=0; i<n; i++)
{
    int j,k;
    cin>>j>>k;
    v.push_back(make_pair(j,k));
}

for(int i=0; i<n; i++)
    cout<<v[i].first<<“ “<<v[i].second<<endl;

上面的代码将列出一对存储在一个名为v的向量中的对。然后用各自的对打印出n个元素。

答案 4 :(得分:0)

您必须使用参考变量作为距离函数的参数。正确的代码如下:

#include<bits/stdc++.h>
#define MOD 10000009

using namespace std;

double distance(const pair<int,int> &p1, const pair<int,int> &p2)
{
   double dist;
   dist = sqrt((p1.first-p2.first)*(p1.first-p2.first) + (p1.second-p2.second)*(p1.second-p2.second));
   return dist;
}

int main()
{
        int N,i,j;
        cin >> N;
        pair<int,int> pi[N];
        for(i=0;i<N;i++)
        {
            cin >> pi[i].first >> pi[i].second;
        }

        for(i=0;i<N;i++)
        {
            cout << pi[i].first << " "<< pi[i].second << endl;
        }

        cout<<distance(pi[0],pi[1]); 

      return 0;
}