Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Membandingkan Lelaran daripada Bekas Berbeza dalam Gelagat Ditakrifkan C?

Adakah Membandingkan Lelaran daripada Bekas Berbeza dalam Gelagat Ditakrifkan C?

Linda Hamilton
Linda Hamiltonasal
2024-11-03 06:03:30696semak imbas

Is Comparing Iterators from Different Containers in C   Defined Behavior?

Membandingkan Iterator daripada Bekas Berbeza dalam C

Dalam konteks pelaksanaan iterator tersuai, persoalan asas timbul: adakah dibenarkan membandingkan iterator daripada bekas yang berbeza? Ambil, sebagai contoh, coretan kod berikut:

<code class="cpp">std::vector<int> foo;
std::vector<int> bar;

// Is this expression valid?
foo.begin() == bar.begin();</code>

Mengikut piawaian C 11:

Iterators dalam Jujukan Yang Sama:

  • Iterators dianggap boleh dihubungi antara satu sama lain jika aplikasi berulang operator kenaikan ( ) mengakibatkan kesaksamaan.
  • Iterators merujuk kepada unsur-unsur urutan yang sama jika ia boleh dicapai antara satu sama lain.

Membandingkan Iterator daripada Bekas Berbeza:

  • Untuk iterator ke hadapan, perbandingan iterator hanya ditakrifkan jika mereka tergolong dalam asas yang sama jujukan.

Oleh itu, membandingkan iterator daripada bekas yang berbeza, seperti foo.begin() dan bar.begin() dalam contoh di atas, dianggap tingkah laku tidak ditentukan.

Tingkah laku yang tidak ditentukan ini berpunca daripada fakta bahawa iterator merujuk elemen tertentu dalam bekas. Apabila iterator tergolong dalam bekas yang berbeza, mereka tidak boleh diandaikan menunjuk kepada unsur dalam urutan asas yang sama, oleh itu perbandingan mereka menghasilkan hasil yang tidak ditentukan.

Isu LWG #446:

Untuk menjelaskan isu ini, isu LWG #446 mencadangkan penambahan teks berikut pada standard:

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... tidak ditentukan, melainkan dinyatakan sebaliknya secara eksplisit.

Tambahan ini lebih menekankan sifat tidak ditentukan untuk membandingkan iterator daripada bekas yang berbeza.

Atas ialah kandungan terperinci Adakah Membandingkan Lelaran daripada Bekas Berbeza dalam Gelagat Ditakrifkan C?. 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