Rumah > Artikel > pembangunan bahagian belakang > Bolehkah Anda Membandingkan Iterator daripada Bekas Berbeza dalam C?
Membandingkan Iterator daripada Bekas Berbeza: Kisah Peringatan
Dalam C , iterator menyediakan mekanisme yang berkuasa untuk melintasi koleksi. Walau bagaimanapun, adalah penting untuk mengetahui batasan apabila menggunakan iterator daripada bekas yang berbeza.
Persoalan sama ada sah untuk membandingkan iterator daripada bekas yang berbeza sering timbul. Pertimbangkan contoh berikut:
<code class="cpp">std::vector<int> foo; std::vector<int> bar; std::cout << (foo.begin() == bar.begin());</code>
Ungkapan ini mungkin kelihatan tidak berbahaya pada pandangan pertama, tetapi ia sebenarnya menghasilkan tingkah laku yang tidak ditentukan. Menurut piawaian C 11, iterator hanya boleh dibandingkan jika mereka merujuk kepada unsur urutan yang sama. Memandangkan foo dan bar ialah dua vektor yang berbeza, iteratornya tidak dapat dibandingkan.
Tingkah laku ini ditekankan lagi dalam isu LWG #446:
"Hasil penilaian secara langsung atau tidak langsung mana-mana fungsi perbandingan atau perduaan - pengendali dengan dua nilai lelaran sebagai argumen yang diperoleh daripada dua julat berbeza r1 dan r2 (...) yang bukan subjulat bagi satu julat sepunya tidak ditentukan, melainkan dinyatakan sebaliknya secara eksplisit."
Sekatan ini mempunyai implikasi yang ketara untuk melaksanakan iterator tersuai. Jika anda bercadang untuk melaksanakan operator== untuk lelaran tersuai anda, anda mesti memastikan bahawa ia hanya membandingkan iterator yang berada dalam julat yang sama.
Gagal mematuhi peraturan ini boleh membawa kepada tingkah laku yang tidak dijangka dan akhirnya memudaratkan kepada kebolehpercayaan kod anda. Oleh itu, adalah penting untuk diingat bahawa membandingkan iterator daripada bekas yang berbeza adalah dilarang sama sekali dalam C .
Atas ialah kandungan terperinci Bolehkah Anda Membandingkan Iterator daripada Bekas Berbeza dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!