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