在c ++中使用pair

use*_*957 1 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;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Mar*_*k B 6

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

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

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


Joh*_*ing 5

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

distance(pi[0],pi[1]); // This line is giving error
Run Code Online (Sandbox Code Playgroud)

distance标准库中有一个,编译器正在解析调用此文件.这是因为你这样做using namespace std.最好不要这样做using namespace std,特别是在标题中,但你可以看到它在这里引起了一个问题.

有一些潜在的解决方案.

  1. 删除using namespace std并限定标准库对象的所有使用(如std::cin)
  2. using namespace std使用特定的using声明替换,仅引入您实际使用的StdLib中的那些片段(如using std::cin)
  3. 更改距离调用以显式引用全局命名空间: ::distance(...);

编辑另外,这不是合法的C++:

int N,i,j;
cin >> N;
pair<int,int> pi[N];
Run Code Online (Sandbox Code Playgroud)

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