English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
C ++ set erase()الوظيفة تستخدم لإزالة العنصر الفريد أو نطاق العناصر المرتبطة بكليتة set من مجموعة البيانات، لذا ستقل الحجم عن طريق عدد العناصر المزالة.
void erase (iterator position); قبل C++ 11 size_type erase (const value_type& val); قبل C++ 11 void erase (iterator first, iterator last); قبل C++ 11 iterator erase (const_iterator position); من بدء C++ 11 size_type erase (const value_type& val); من بدء C++ 11 iterator erase (const_iterator first, const_iterator last); من بدء C++ 11
المنطقالم迭代ر، يشير إلى العنصر الفريد المراد إزالته من المجموعة
القيمةالقيمة المراد إزالتها من المجموعة
أولالبداية المراد مسحها
آخرالنهاية المراد مسحها
يستعيد م迭代رًا إلى العنصر التالي للعنصر المزال، أو يعيد عدد العناصر المزالة.
erase(position): معامل ثابت.
erase (val): معامل حجم المجموعة.
erase(first,last)المدى بين الأول والأخير هو خطي.
الم迭代رات، المراجع والنقاطع التي تشير إلى العنصر المزال تصبح غير صالحة.
جميع الم迭代رات، النقاطع والمراجع تبقى صالحة.
المجموعة قد تم تعديلها.
العنصر المزال سيتم تعديله. على الرغم من أن الوصول إلى العناصر الأخرى أثناء الوصول إلى المجموعة أمر آمن، إلا أن الت迭代 في نطاق المجموعة ليس آمنًا.
هذه الوظيفة لا تسبب استثناءً.
إذا تم تحديد نطاق غير صالح أو موقع، فإنه يؤدي إلى سلوك غير معرف.
دعنا نرى مثالاً بسيطاً لإزالة العناصر باستخدام م迭代ر.
#include <iostream> #include <set> using namespace std; int main() { set<int> myset; set<int>::iterator it; myset = { 10,20,30 } ; cout<<"قبل إزالة العنصر: \n"; for(it=myset.begin(); it!=myset.end(); ++it) cout << *it << '\n'; it=myset.find('b'); myset.erase(*it); //إزالة باستخدام م迭代ر cout<<"\nبعد إزالة العنصر: \n"; for(it=myset.begin(); it!=myset.end(); ++it) cout << *it << '\n'; return 0; }
الإخراج:
قبل حذف العناصر: 10 20 30 بعد إزالة العنصر: 10 20 30
في المثال السابق، تم إزالة العنصر باستخدام م迭代ر.
دعنا نرى مثالاً بسيطاً لإزالة العنصر في المجموعة باستخدام مفتاح معين:
#include <iostream> #include <set> using namespace std; int main() { set<int> myset; set<int>::iterator it; myset = {10, 20, 30, 40}; cout<<"قبل إزالة العنصر: \n"; لـ(it=myset.begin(); it!=myset.end(); ++it){ cout << *it << '\n'; } myset.erase(30); // إزالة القيمة المحددة cout<<"\nالإزالة بعد عنصر: \n"; لـ(it=myset.begin(); it!=myset.end(); ++it){ cout << *it << '\n'; } return 0; }
الإخراج:
قبل حذف العناصر: 10 20 30 40 بعد حذف العناصر: 10 20 40
في المثال السابق، تم استخدام وظيفة erase (value) باستخدام القيمة 30 في المجموعة.
دعنا نرى مثالاً بسيطاً لإزالة العناصر في نطاق معين:
#include <iostream> #include <set> using namespace std; int main() { set<int> myset; set<int>::iterator it; myset = { 10, 20, 30 }; cout<<"قبل إزالة العنصر: \n"; cout<<"حجم هو: "<<myset.size()<<'\n'; لـ(it=myset.begin(); it!=myset.end(); ++it){ cout << *it << '\n'; } myset.erase(myset.begin(), myset.end()); //إزالة نطاق معين cout<<"\nالإزالة بعد عنصر: \n"; cout<<"حجم هو: "<<myset.size(); لـ(it=myset.begin(); it!=myset.end(); ++it){ cout << *it << '\n'; } return 0; }
الإخراج:
قبل حذف العناصر: الحجم: 3 10 20 30 بعد حذف العناصر: الحجم: 0
في المثال السابق، تم استخدام وظيفة Erase (first،last) لإزالة العناصر التي تحتوي على نطاق معين (أي من البداية إلى النهاية).
دعونا نرى مثالاً بسيطاً لتحذيف جميع الأعداد الصحيحة من الجمعية:
#include <set> #include <iostream> using namespace std; int main() { set<int> m = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; // حذف جميع الأعداد الصحيحة من m cout << " بعد حذف الأعداد الصحيحة، العناصر هي:\n "; for (auto it = m.begin(); it != m.end();){ if (*it % 2 == 1) { it = m.erase(it); } ++it; } } for (auto& p : m) { cout << p << ", "; } }
الإخراج:
بعد حذف الأعداد الصحيحة، العناصر هي: 2, 4, 6, 8, 10, 12, 14,
في المثال السابق، تم حذف جميع الأعداد الصحيحة، وأظهرت الأعداد الزوجية.
دعونا نرى مثالاً آخر:
#include <set> #include <string> #include <iostream> #include <iterator> // مساعدات next() و prev() using namespace std; using myset = set<string>; void printset(const myset& s) { for (const auto& iter : s) { cout << " [" << iter << "]"; } cout << endl << "size() == " << s.size() << endl << endl; } int main() { myset s1; // إدخال بعض البيانات للاختبار، واحدة تلو الأخرى s1.insert("Bob"); s1.insert("Robert"); s1.insert("Bert"); s1.insert("Rob"); s1.insert("Bobby"); cout << " بداية البيانات الخاصة بالجمعية s1:" << endl; printset(s1); // الاعضاء الأولي للوظيفة تزيل العنصر المحدد في الموقع s1.erase(next(s1.begin())); cout << "بعد إزالة العنصر الثاني، مجموعة s1 تصبح:" << endl; printset(s1); // استخدام قائمة التوليد مرة واحدة لإدخال بيانات للإختبار myset s2{ "meow", "hiss", "purr", "growl", "yowl" }; cout << "بداية البيانات لمجموعة s2 هي:" << endl; printset(s2); // الوظيفة الثانية تزيل العناصر // نطاق [First, Last) s2.erase(next(s2.begin()), prev(s2.end())); cout << "بعد إزالة العنصر الوسطي، مجموعة s2 تصبح:" << endl; printset(s2); myset s3; // استخدام emplace مرة واحدة لإدخال بيانات للإختبار s3.emplace("C"); s3.emplace("C#"); s3.emplace("D"); s3.emplace("D#"); s3.emplace("E"); s3.emplace("E#"); s3.emplace("F"); s3.emplace("F#"); s3.emplace("G"); s3.emplace("G#"); s3.emplace("A"); s3.emplace("A#"); s3.emplace("B"); cout << "بداية البيانات لمجموعة s3 هي:" << endl; printset(s3); // الوظيفة الثالثة تزيل العنصر ذي المفتاح المحدد myset::size_type count = s3.erase("E#"); // الوظيفة الثالثة أيضًا تعود عدد العناصر المزالة cout << "عدد العناصر المزالة من s3 هي: " << count << "." << endl; cout << "بعد إزالة العنصر ذي المفتاح "E#"، مجموعة s3 تصبح:" << endl; printset(s3); }
الإخراج:
بداية البيانات لمجموعة s1 هي: [Bert] [Bob] [Bobby] [Rob] [Robert] size() == 5 بعد إزالة العنصر الثاني، مجموعة s1 تصبح: [Bert] [Bobby] [Rob] [Robert] size() == 4 مجموعة s2 بداية البيانات هي: [growl] [hiss] [meow] [purr] [yowl] size() == 5 بعد إزالة العنصر المتوسط، يتم تحويل مجموعة s2 إلى: [growl] [yowl] size() == 2 البداية السابقة للمجموعة s3 كانت: [A] [A#] [B] [C] [C#] [D] [D#] [E] [E#] [F] [F#] [G] [G#] size() == 13 عدد العناصر المزالة من s3: 1. بعد إزالة العنصر المحدد بـ“E#”، يتم تحويل مجموعة s3 إلى: [A] [A#] [B] [C] [C#] [D] [D#] [E] [F] [F#] [G] [G#] size() == 12