在C ++中使用pair

问题描述 投票:1回答:5

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

#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;
}

c++ stl
5个回答
6
投票

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

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

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


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(...);

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

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

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


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;
}

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”对的列表(或数组或向量),为此我们可以使用这样的向量数据结构:

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个元素用它们各自的对打印出来。


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;
}
© www.soinside.com 2019 - 2024. All rights reserved.