olasılıkla gerçek değildir. (Aksi takdirde vector
std::vector
olması gerekir.) That's something I would advise against ve neden iyi bir durum sağladıysanız:
Kaza sonucu, aramanız iki yineleyici alır ve aralarındaki mesafeyi hesaplar std::distance()
alır. std::
ile tüm standart kitaplık türlerini kullanma yönergesini ve önekini kaldırın ve derleyici size vector <point>::iterator
'u point*
'un gerekli olduğu yerlerde iletmeye çalıştığınızı söyleyecektir.
Yineleyicinin işaret ettiği bir nesneye bir işaretçi almak için, yineleyicinin - nesneye bir başvuruda bulunarak - ve sonucun adresini almanız gerekir: &*ii
.
(Bir işaretçinin bir std::vector
yineleyici için tüm gereksinimleri ve standart kitaplık için gerçekten kullanılan işaretçilerin bazı önceki uygulamalarını mükemmel bir şekilde yerine getireceğini unutmayın; bu, std::vector
yineleyicilerini işaretçi olarak kullanmanıza olanak tanır. Ancak, modern uygulamalar, bunun için özel bir yineleme sınıfı kullanır. Bunun nedeni, bir sınıf kullanmanın, işaretçiler ve yineleyiciler için aşırı yükleme işlevlerine izin verdiğidir.Ayrıca, std::vector
yineleyicileri olarak işaretçileri kullanarak, kapsayıcınızı değiştirdiğinizde kodun derlenmesini engelleyen karıştırma işaretleyicilerini ve yineleyicileri de teşvik eder.)
Ancak Bunu yapmak yerine, işlevinizi değiştirmenizi öneririm, böylece bunun yerine referanslar alır (neden bu iyi bir fikir olduğunu görmek için this answer'a bakın.):
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));
}
Bu noktaların const
referans alınarak alındığını unutmayın. Bu, arayan kişiye işlevin geçirilen noktaları değiştirmeyeceğini gösterir.
Ardından bunu şu şekilde arayabilirsiniz: distance(*ii,*jj)
. Yan not
bu
typedef struct point {
float x;
float y;
} point;
C++ gereksiz bir Cı-izm. Sadece
struct point {
float x;
float y;
};
bu
struct
tanım şimdiye (kod, daha sonra
struct point
başvurmak zorunda kalacak değil sadece
point
) bir C derleyicisinden ayrıştırmak olsaydı sorunları yapmak ama
std::vector
tahmin ve benzeri ediyorum
olur büyü Zaten bir C derleyicisine daha fazla meydan okuma.
Bu yanıt yanlış. std :: mesafe bir std :: yineleyici üzerinde ADL tarafından alınabilir, bu yüzden std' kullanılıp kullanılmadığına bakılmaksızın aday kümesinin bir parçasını oluşturabilir. – Puppy
@Puppy: Bu gerçekten doğrudur (ve 2.5 yıldır kimse farketmez), fakat bu benim cevabımın hepsi değil. Const point & p1' başına düşen puanlar da bu sorunu çözecektir. – sbi
@sbi: Hayır, sorunu çözmeyecek. Mesafe (ii, jj) 'yi yanlışlıkla yazıp,' std :: distance' yazısını almak mümkün olacaktır. –