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

введите описание изображения здесь

1

Решение

distance определяется стандартной библиотекой, которую вы уже usingв глобальном пространстве имен, поэтому он пытается использовать тот, который вы написали (и не ожидал).

Вызовите свою функцию как-нибудь еще, чтобы избежать конфликта имен.

Также как примечания стиля, в коде C ++ #define обычно можно заменить на const или inline-функции для обеспечения большей безопасности типов, и мне нравится писать using std::coutи т. д. для каждого элемента мне нужно, а не using namespace std,

6

Другие решения

Есть как минимум 3 проблемы с вашим кодом, которые делают его нелегальным C ++. Это вопрос:

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

Eсть 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 ++.

5

Джон Диблинг дал хорошее объяснение проблемы, но даже снял 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;
}
2

Использование пары в 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 элементов распечатываются с соответствующими парами.

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;
}
0
По вопросам рекламы [email protected]