Membandingkan Iterator daripada Bekas Berbeza: Menjelaskan Gelagat Tidak Ditakrifkan
Apabila bekerja dengan iterator dalam C , adalah penting untuk memahami batasan membandingkan iterator daripada bekas yang berbeza. Artikel ini menyelidiki persoalan sama ada ungkapan foo.begin() == bar.begin() menghasilkan gelagat palsu atau tidak ditentukan, dengan foo dan bar adalah dua bekas vektor std:: yang berasingan.
Menurut C 11 standard (n3337), iterator dari bekas yang berbeza tidak boleh dibandingkan secara langsung. Bahagian 24.2.5 menyatakan bahawa domain pengendali kesamaan == untuk iterator ke hadapan hanya ditakrifkan untuk iterator pada urutan asas yang sama. Memandangkan bekas yang berbeza dianggap urutan yang berasingan, membandingkan iterator daripadanya ialah gelagat yang tidak ditentukan.
Selain itu, isu LWG #446 secara khusus menangani soalan ini. Cadangan ini bertujuan untuk menambah teks eksplisit pada standard yang menjelaskan bahawa membandingkan iterator daripada julat yang berbeza, melainkan ditakrifkan sebaliknya secara eksplisit, adalah tidak ditentukan. Ini menekankan bahawa walaupun secara tidak langsung membandingkan iterator daripada julat yang berbeza, seperti menggunakan fungsi seperti std::find, boleh mengakibatkan gelagat tidak ditentukan.
Oleh itu, adalah penting untuk mengelak daripada membandingkan iterator daripada bekas atau subjulat berbeza bagi bekas yang berbeza. Melakukannya boleh membawa kepada hasil yang tidak dapat diramalkan dan harus dielakkan dalam amalan kod yang teguh.
Atas ialah kandungan terperinci Adakah Membandingkan Lelaran daripada Bekas Berbeza Kelakuan Tidak Ditakrifkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!