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

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

Barbara Streisand
Barbara Streisandasal
2024-10-31 06:31:30990semak imbas

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>

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>

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>

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>

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:
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