Может кто-нибудь, пожалуйста, скажите, почему я не могу скомпилировать следующую программу
#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;
}
distance
определяется стандартной библиотекой, которую вы уже using
в глобальном пространстве имен, поэтому он пытается использовать тот, который вы написали (и не ожидал).
Вызовите свою функцию как-нибудь еще, чтобы избежать конфликта имен.
Также как примечания стиля, в коде C ++ #define
обычно можно заменить на const или inline-функции для обеспечения большей безопасности типов, и мне нравится писать using std::cout
и т. д. для каждого элемента мне нужно, а не using namespace std
,
Есть как минимум 3 проблемы с вашим кодом, которые делают его нелегальным C ++. Это вопрос:
distance(pi[0],pi[1]); // This line is giving error
Eсть distance
в стандартной библиотеке, и компилятор решает вызвать эту. Это связано с тем, что вы делаете using namespace std
, Желательно не делать using namespace std
вообще, особенно в заголовках, но, как вы можете видеть, это вызывает проблему и здесь.
Есть несколько потенциальных решений.
using namespace std
и квалифицировать все ваши использования объектов стандартной библиотеки (например, std::cin
)using namespace std
с конкретными объявлениями использования, принося только те части из StdLib, которые вы фактически используете (например, using std::cin
)::distance(...);
редактировать Кроме того, это не разрешено C ++:
int N,i,j;
cin >> N;
pair<int,int> pi[N];
Стандартный C ++ позволяет объявлять массивы в стиле C только тогда, когда размер известен во время компиляции. Вы, вероятно, используете инструмент gcc для создания этого, поэтому это не приводит к ошибке. Однако вы используете расширение языка GCC, массивы динамического размера, а написанный вами код не является частью самого языка C ++.
Джон Диблинг дал хорошее объяснение проблемы, но даже снял 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;
}
Использование пары в C ++
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 элементов распечатываются с соответствующими парами.
Вы должны использовать ссылочную переменную в качестве аргумента функции расстояния. Правильный код указан ниже:
#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;
}