আমাকে একটি সেট দিয়ে যেতে হবে এবং এমন উপাদানগুলি সরিয়ে ফেলতে হবে যা পূর্বনির্ধারিত মানদণ্ডের সাথে মিলিত হয়।
এটি আমি লিখেছি পরীক্ষার কোড:
#include <set>
#include <algorithm>
void printElement(int value) {
std::cout << value << " ";
}
int main() {
int initNum[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::set<int> numbers(initNum, initNum + 10);
// print '0 1 2 3 4 5 6 7 8 9'
std::for_each(numbers.begin(), numbers.end(), printElement);
std::set<int>::iterator it = numbers.begin();
// iterate through the set and erase all even numbers
for (; it != numbers.end(); ++it) {
int n = *it;
if (n % 2 == 0) {
// wouldn't invalidate the iterator?
numbers.erase(it);
}
}
// print '1 3 5 7 9'
std::for_each(numbers.begin(), numbers.end(), printElement);
return 0;
}
প্রথমে, আমি ভেবেছিলাম যে সেটটি থেকে উপাদানটি মুছে ফেলার সময় এটির পুনরাবৃত্তিটি পুনরুক্তিটিকে অকার্যকর করে দেবে এবং লুপের জন্য বৃদ্ধিটি অপরিজ্ঞাত আচরণ করবে। যদিও, আমি এই পরীক্ষার কোডটি কার্যকর করেছিলাম এবং সবকিছু ঠিকঠাক হয়ে গেছে, এবং আমি কেন তা ব্যাখ্যা করতে পারি না।
আমার প্রশ্ন: এটি কি এসটিডি সেটগুলির জন্য নির্ধারিত আচরণ বা এই বাস্তবায়ন নির্দিষ্ট? আমি যাইহোক, উবুন্টু 10.04 (32-বিট সংস্করণ) -এ জিসিসি 4.3.3 ব্যবহার করছি।
ধন্যবাদ!
প্রস্তাবিত সমাধান:
সেট থেকে উপাদানগুলি পুনরাবৃত্তি এবং মুছতে এটি কি সঠিক উপায়?
while(it != numbers.end()) {
int n = *it;
if (n % 2 == 0) {
// post-increment operator returns a copy, then increment
numbers.erase(it++);
} else {
// pre-increment operator increments, then return
++it;
}
}
সম্পাদনা করুন: সমাধান সমাধান
আমি এমন একটি সমাধান পেয়েছিলাম যা আমার কাছে আরও মার্জিত বলে মনে হয়, যদিও এটি ঠিক একই রকম হয়।
while(it != numbers.end()) {
// copy the current iterator then increment it
std::set<int>::iterator current = it++;
int n = *current;
if (n % 2 == 0) {
// don't invalidate iterator it, because it is already
// pointing to the next element
numbers.erase(current);
}
}
যদি সময়ের মধ্যে বেশ কয়েকটি পরীক্ষার শর্ত থাকে তবে তাদের প্রত্যেককে অবশ্যই পুনরাবৃত্তিকে বৃদ্ধি করতে হবে। আমি এই কোডটি আরও ভাল পছন্দ করি কারণ কোডটি কম ত্রুটি-প্রবণ এবং আরও পঠনযোগ্য করে এটারেটরটি কেবলমাত্র এক জায়গায় বাড়ানো হয়।
++it
চেয়ে কিছুটা বেশি দক্ষ হওয়া উচিত it++
কারণ এটির পুনরুক্তির কোনও অদৃশ্য অস্থায়ী অনুলিপি ব্যবহারের প্রয়োজন হয় না। কার্নেলের সংস্করণ দীর্ঘকাল পর্যন্ত নিশ্চিত করে যে ফিল্টারবিহীন উপাদানগুলিকে সবচেয়ে দক্ষতার সাথে পুনরাবৃত্তি করা হয়।