تحديد ما إذا كان الكائن موجودًا في std::set

StackOverflow https://stackoverflow.com/questions/820859

  •  03-07-2019
  •  | 
  •  

سؤال

أحاول تحديد ما إذا كان الكائن موجودًا بالفعل داخل ملف std::set.وفقًا لـ msdn (والمصادر الأخرى) من المفترض أن تعود وظيفة set::find end() إذا لم تجد العنصر الذي طلبته.

ولكن عندما أقوم بتنفيذ التعليمات البرمجية مثل ما يلي، set::find إرجاع غير المرغوب فيه (0xbaadf00d) بدلاً من.

set<Cell*> cellSet;

Cell* cell = new Cell();    

if (cellSet.find(cell) == cellSet.end())
{
    ...
}

هل أستخدم هذا بشكل صحيح؟أنا أعمل في Visual C++ 2005.

هل كانت مفيدة؟

المحلول

سوف يقوم الكود الخاص بك كما تم نشره دائمًا بتنفيذ الكود داخل ملف if, ، و 0xbaadf00d يكون علامة "النهاية الماضية" الخاصة بالتنفيذ.

نصائح أخرى

عند استخدام مجموعة STL أود أن استخدام عدد وظيفة لتحديد العضوية. وأعتقد أن هذا يجعل رمز أسهل للقراءة.

set<Cell*> cellSet;

Cell* cell = new Cell();    

if (cellSet.count(cell) == 0)
{
    ...
}

هل لدى callSet.end() القيمة 0xbaadf00d أيضًا؟

يحرر

لقد قمت بتشغيل نموذج التعليمات البرمجية هذا في VS2008 وعمل كل شيء كما هو متوقع.أعادت وظيفة البحث مكررًا يشير إلى القيمة الأصلية.

ما هو السلوك الذي تراه بالضبط؟هل تُرجع end() أم تُرجع مكانًا آخر في المجموعة؟

وحاول تجميع وتشغيل <م> فقط المقتطف التي قدمتها، وأنا أضمن لكم سوف تجد أنه ينفذ دون مشاكل. المشكلة هي يكاد يكون من المؤكد بسبب الذاكرة البق تخصيص تحدث في أي مكان آخر في البرنامج، مثل الرجوع إلى مؤشر uninitialised أو مؤشر إلى كائن تم deleted.

هل أنت على دراية كيفية إدارة الحاويات C ++ أهدافها؟ انهم لا حذف المؤشرات بالنسبة لك. هو دائما أكثر أمانا لاستخدام حاويات من الكائنات، بدلا من المؤشرات إلى الأشياء، وعندما يكون ذلك ممكنا. (وهناك حالات عندما ضرورية حاويات من المؤشرات - على وجه الخصوص، عندما تريد الحاوية لتخزين كائنات من أنواع مختلفة من التسلسل الهرمي فئة واحد)

وخطأ واحد بسيط هو أنه يجب أن يكون اختبار للا تساوي حتى النهاية.

set<Cell*> cellSet;
Cell* cell = new Cell();
if (cellSet.find(cell) != cellSet.end())     // Test NOT EQUAL to end
{
     // Found item in set.
}

ولكن أيضا يجب ملاحظة أن كنت لا مقارنة القيم الفعلية خلية لكن المؤشر إلى الخلية الكائنات (التي قد تكون أو لا تكون ما تريد). عادة في C ++ كنت لا تميل إلى تخزين المؤشرات في حاويات لعدم وجود ملكية القابلية للمؤشر لكن somtimes هذا هو موافق.

لمقارنة في الواقع الكائنات التي تحتاج إلى استخدام find_if () وتمرير المسند (أ functor).

struct PointerCellTest
{
    Cell&  m_lhs;
    PointerCellTest(Cell* lhs): m_lhs(lhs) {}
    bool operator()(Cell* rhs)
    {
         return lhs.<PLOP> == rhs.<PLOP>
    }
};


if(find_if(cellSet.begin(),cellSet.end(),PointerCellTest(cell)) != cellSet.end())
{
     // Found item in set.
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top