Rumah > pembangunan bahagian belakang > C++ > Mengapa Pengiraan Jarak Iterator C Saya Menghasilkan Keputusan Yang Tidak Dijangka?

Mengapa Pengiraan Jarak Iterator C Saya Menghasilkan Keputusan Yang Tidak Dijangka?

Barbara Streisand
Lepaskan: 2024-10-31 06:31:30
asal
1117 orang telah melayarinya

Why Does My C   Iterator Distance Calculation Yield Unexpected Results?

Nuansa Penggunaan Iterator: Membezakan Pengiraan Jarak dalam C

Dalam C , iterator menyediakan cara yang berkuasa untuk melintasi dan mengakses elemen dalam bekas. Walau bagaimanapun, penggunaannya kadang-kadang boleh bernuansa, membawa kepada hasil yang tidak dijangka. Pertimbangkan senario berikut:

Pernyataan Masalah

Apabila cuba mengira jarak antara titik yang disimpan dalam vektor, hasil yang dijangkakan (0, 1.4, 1.4, 0) menyimpang daripada hasil sebenar ( 0, 1, -1, 0). Percanggahan ini mungkin berpunca daripada isu dengan penggunaan lelaran.

Penilaian Kod

Kod yang disediakan menggunakan vektor mata dengan pengiraan jarak tersuai menggunakan fungsi:

<code class="cpp">typedef struct point {
    float x;
    float y;
} point;

float distance(point *p1, point *p2)
{
    return sqrt((p1->x - p2->x) * (p1->x - p2->x) +
                (p1->y - p2->y) * (p1->y - p2->y));
}</code>
Salin selepas log masuk

Dalam fungsi utama, iterator ditakrifkan dan digunakan untuk melintasi vektor:

<code class="cpp">vector<point>::iterator ii;
vector<point>::iterator jj;
for (ii = po.begin(); ii != po.end(); ii++)
{
    for (jj = po.begin(); jj != po.end(); jj++)
    {
        cout << distance(ii, jj) << " ";
    }
}</code>
Salin selepas log masuk

Menyelesaikan Isu

Masalahnya terletak pada seruan std::distance() secara tidak sengaja disebabkan oleh kehadiran arahan "menggunakan ruang nama std". Fungsi ini menjangkakan iterator, tetapi kod tersilap menghantar vektor::iterator.

Untuk membetulkan isu, adalah penting untuk menetapkan awalan jenis perpustakaan standard dengan std::, memastikan bahawa pengkompil akan membenderakan dengan sewajarnya tidak sepadan dalam parameter fungsi.

Selain itu, disyorkan untuk mengubah suai fungsi untuk menerima rujukan sebaliknya:

<code class="cpp">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));
}</code>
Salin selepas log masuk

Perubahan ini melarang fungsi daripada mengubah suai titik yang dilalui.

Pertimbangan Tambahan

Typedef yang digunakan sebelum ini boleh dipermudahkan dalam C moden :

<code class="cpp">struct point {
    float x;
    float y;
};</code>
Salin selepas log masuk

Ini menghapuskan sintaks seperti C yang tidak diperlukan dan selaras dengan piawaian C.

Atas ialah kandungan terperinci Mengapa Pengiraan Jarak Iterator C Saya Menghasilkan Keputusan Yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan