То, что ваш код вообще компилируется, возможно потому, что у вас где-то есть using namespace std
. (В противном случае vector
должно быть std::vector
.) Это то, что я бы посоветовал против , и вы только что привели хороший пример, почему:
Случайно ваш звонок набирает std::distance()
, который берет два итератора и вычисляет расстояние между ними. Удалите директиву using и добавьте std::
ко всем стандартным типам библиотек, и компилятор скажет вам, что вы пытались передать vector <point>::iterator
, где требовался point*
.
Чтобы получить указатель на объект, на который указывает итератор, вам нужно разыменовать итератор - который дает ссылку на объект - и взять адрес результата: &*ii
.
(Обратите внимание, что указатель будет полностью соответствовать всем требованиям для итератора std::vector
, а некоторые более ранние реализации стандартной библиотеки действительно использовали для этого указатели, что позволяло обрабатывать итераторы std::vector
как указатели. Но современные реализации используют специальный класс итераторов для этого. Я предполагаю, что причина в том, что использование класса допускает перегрузку функций для указателей и итераторов. Кроме того, использование указателей в качестве std::vector
итераторов поощряет смешивание указателей и итераторов, что предотвратит компиляцию кода при изменении контейнера.)
Но вместо того, чтобы делать это, я предлагаю вам изменить свою функцию, чтобы вместо нее использовались ссылки (см. этот ответ , почему это хорошая идея в любом случае.):
float distance(const point& p1, const point& p2)
{
return sqrt((p1.x - p2.x)*(p1.x - p2.x) +
(p1.y - p2.y)*(p1.y - p2.y));
}
Обратите внимание, что баллы принимаются const
ссылками. Это указывает вызывающей стороне, что функция не изменит точки, которые ей переданы.
Тогда вы можете назвать это так: distance(*ii,*jj)
.
На заметку, это
typedef struct point {
float x;
float y;
} point;
- это C-ism, ненужный в C ++. Просто назови это
struct point {
float x;
float y;
};
Это создаст проблемы, если это определение struct
когда-либо будет анализироваться с компилятором C (тогда код должен ссылаться на struct point
, а не просто point
), но я думаю, std::vector
и тому подобное В любом случае, это будет гораздо более сложной задачей для компилятора Си.