Apabila melelaran pada vektor dalam C , pengaturcara sering menghadapi soalan: Patutkah kita menggunakan pembolehubah indeks yang ditandatangani atau tidak ditandatangani? Pilihan lalai, menggunakan pembolehubah yang tidak ditandatangani, mungkin menimbulkan kebimbangan tentang isu yang berpotensi atau tingkah laku yang tidak dijangka. Artikel ini bertujuan untuk menjelaskan pilihan ini, mengkaji sebab di sebalik penggunaan pembolehubah yang tidak ditandatangani dan menyediakan pilihan alternatif untuk lelaran.
Sebab utama untuk menggunakan pembolehubah yang tidak ditandatangani pembolehubah indeks (cth., unsigned int) adalah untuk memastikan bahawa indeks tidak pernah menjadi negatif. Peulang dan pengendali subskrip boleh bergerak ke belakang melalui vektor, menghasilkan indeks negatif. Walau bagaimanapun, menggunakan pembolehubah integer yang ditandatangani untuk indeks menimbulkan amaran pengkompil dan memerlukan penukaran eksplisit untuk mengendalikan nilai negatif.
Pertimbangkan coretan kod berikut yang menjana amaran pengkompil:
for (int i = 0; i < polygon.size(); i++) { sum += polygon[i]; // Warning: signed vs. unsigned integer comparison }
Daripada bergantung pada pembolehubah indeks, terdapat dua pendekatan alternatif untuk lelaran ke atas vektor: menggunakan iterator atau menerima ciri C moden.
Menggunakan iterator:
Iterators menyediakan antara muka berorientasikan objek untuk merentasi bekas. Mereka mengendalikan pengurusan indeks secara automatik dan menyediakan keupayaan lelaran terbalik. Kod berikut menunjukkan penggunaan iterator:
for (std::vector<int>::iterator it = polygon.begin(); it != polygon.end(); ++it) { sum += *it; }
Menggunakan julat C 11 untuk gelung:
Diperkenalkan dalam C 11, julat untuk gelung ialah cara yang mudah untuk mengulangi bekas. Ia menghapuskan keperluan untuk pengurusan indeks atau iterator yang jelas:
for (auto& element : polygon) { sum += element; }
Menggunakan pembolehubah indeks yang tidak ditandatangani untuk lelaran vektor biasanya dianggap sebagai pendekatan yang selamat dan disyorkan. Ia menghalang indeks negatif dan memastikan indeks kekal dalam julat yang sah. Pilihan alternatif, seperti menggunakan iterator atau memanfaatkan ciri C 11, menyediakan keupayaan yang lebih maju untuk melintasi vektor. Pilihan kaedah bergantung pada keperluan khusus dan keutamaan pengaturcara.
Atas ialah kandungan terperinci Patutkah Anda Menggunakan Pembolehubah Indeks Bertanda atau Tidak Bertandatangan Apabila Mengulangi std::vector dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!