الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Exception 0xC0000005 with list

بدأه وَدَق. في 24 نوفمبر 2014 · 4 رد · 1,200 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته
تحيّة طيبة.
 
أعمل على برنامج يقوم بإضافة المهام باستخدام list
عند طلب حذف مهمة معينة يخرج البرنامج بسبب 
unhandled exception. 0xC0000005
 
Rw6DXt.png

#include <iostream>
#include <list>

using namespace std;

int main(){

	list <string> mylist;
	string x;

	cout<<"test: ";
	cin>> x;

	mylist.push_back("a");
	mylist.push_back("b");

    for (list<string>::iterator it = mylist.begin(); it != mylist.end(); ++it) {
        if(*it == x)
            mylist.remove(x);
    }
}

أتمنى مساعدتي :(

وجوزيتم خيرًا ()

تم تعديل هذه المشاركة بواسطة وَدَق. في 25 نوفمبر 2014 في 00:12

#2

عند حذفك للعنصر، فكائن الـlist<string>::iterator لم يعد صالح لأنه يشير لعنصر محذوف:

 

اقتباس

 

std::list::remove

Iterator validity
Iterators, pointers and references referring to elements removed by the function are invalidated.
All other iterators, pointers and reference keep their validity.

 

يمكنك استدعاء remove مباشرة وتمرير x لها وستحذف العناصر المساوية لـx.

...
int main() {
  list <string> mylist;
  string x;

  cout<<"test: ";
  cin>> x;

...
  mylist.remove(x);
...
}

أو يمكنك استخدام remove_if وتمرير دالة أو أي كائن يمكن استدعاءه، للفلترة الأكثر تعقيد، مثل:

...
struct is_equal_to {
  const string& target;

  is_equal_to(const string& target) : target(target)
  { }

  bool operator()(const string& element) const
  { return element == target; }
};

int main() {
  list <string> mylist;
  string x;

  cout<<"test: ";
  cin>> x;

...
  mylist.remove_if(is_equal_to(x));
...
}
#3
struct is_equal_to {
  const string& target;

  is_equal_to(const string& target) : target(target)
  { }

  bool operator()(const string& element) const
  { return element == target; }
};

هل بإمكانك شرح محتوى struct؟

 

أعلم أنّ operator تختبر إذا كان العنصر = تارقت. ولكن ما فائدة الدالة التي قبلها؟

#4

كيف يمكنني استخدام هذه struct للبحث عن عنصر في اللست؟

تم تعديل هذه المشاركة بواسطة وَدَق. في 1 ديسمبر 2014 في 20:48

#5

الـstruct مثل class عدى أن عناصرها افتراضياً public (في الـclass افتراضياً private). operator() ستسدعى إذا استعيدتي الكائن (تجعله كما لو كان دالة)، جربي هذا:

 

#include <iostream>
using namespace std;

struct Object
{
  Object() {
    cerr << "Object()" << endl;
  }

  void operator()() const {
    cerr << "void operator()() const" << endl;
  }
};

int main(void)
{
  Object obj;

  obj(); // << سيستدعي void operator()() const
}

 

أعتقد أن remove كل ماتحتاجينه إذا كنتي تريدين ازالة القيم المساوية.

 

بالنسبة للبحث فيمكنك استخدام find الموجودة في الملف الرأسي <algorithm>، مثال:

 

#include <iostream>
#include <list>
#include <algorithm>
 
using namespace std;
 
int main(){
  list <string> mylist;

    mylist.push_back("a");
  mylist.push_back("b");


  list<string>::iterator it;

  // عنصر موجود
  it = find(mylist.begin(), mylist.end(), "b");

  if(it != mylist.end()) {
    cout << "b found: " << *it << endl;
  } else {
    cout << "b not found" << endl;
  }

  // عنصر غير موجود
  it = find(mylist.begin(), mylist.end(), "x");

  if(it != mylist.end()) {
    cout << "x found: " << *it << endl;
  } else {
    cout << "x not found" << endl;
  }
}

مواضيع مشابهة