שאלה על ה-STL של C+++

Nי cוני

New member
שאלה על ה-STL של C+++

שלום לכום
יש לי שאלה לגבי set של ה-STL. אני צריכה ליצור set שטיפוס האיברים בו הוא struct שהגדרתי. הוא נותן לי כל מיני שגיאות מוזרות שכאלה. האם הדבר אפשרי? ואם כן, איך עושים את זה? תודה
 

the new L

New member
שים לב

שעליך לממש אופרטור > עבור איברי ה struct שלך, ויותר מכך, בשביל להכניסו ל set הוא חייב להיות יחס אנטי סימטרי, טרנזיטיבי, ואנטי רפלקסיבי.
 

gmorphus

New member
ובעברית:

טרנזיטיבי - אם a<b וגם b<c אז a<c. אנטי סימטרי - אם a<b אז לא מתקיים b<a. אנטרי רפלקסיבי - לא מתקיים a<a.
 

vinney

Well-known member
סדר מלא קוראים לזה

בעצם, סדר חלקי, אבל בשביל set צריך סדר מלא, אם זכרוני אינו מטעה אותי.
 

לירע

New member
אתה טועה

סדר חלקי הוא רפלקסיבי, ומה שאני הגדרתי הוא אנטי-רפלקסיבי.אם הוא יהיה רפלקסיבי, אז תוכל להכניס לset שני איברים עם אותו ערך.לדוגמה:
#include <iostream> #include <set> using namespace std; class Number { public: Number(int i) : m_i(i) {} bool operator <(const Number &number) const { return m_i <= number.m_i; } private: int m_i; }; int main() { set<Number> st; st.insert(Number(1)); st.insert(Number(1)); cout << st.size() << endl; return 0; }​
ידפיס 2 ולא 1 כפי שהיית מצפה.
 

vinney

Well-known member
לא הייתי מצפה../images/Emo13.gif

סט זה קבוצה, לא הייתי מצפה שני איברים זהים שם
 

vinney

Well-known member
הבנתי איפה איבדתי אותך../images/Emo13.gif

לא אנטי רפלקסיבי, התכוונת לא-סימטרי א-סימטרי אומר שאם aRb אז לא bRa, משמע אם a <= b אז לא b <= a, מכאן לא יכול להיות שוויון.
 

לירע

New member
אתה שוב טועה

אנטי סימטרי אומר שאם aRb וגם bRa אז a=b. ראה כאן: http://mathworld.wolfram.com/AntisymmetricRelation.html
 

vinney

Well-known member
אבל לא אמרתי אנטי סימטרי

אמרתי א-סימטרי. זה שני דברים שונים.
 

Nי cוני

New member
ניסיתי לעשות משהו שדומה

לדוגמא שכתבת פה, אבל עכשיו אני מקבל 9 warnings מספר C4786
 

Nי cוני

New member
OK, סליחה. הנה כל הפרטים בצורה מלאה

ומראש תודה לכולם על העזרה: זהו הטיפוס שהפכתי ל-class כדי לכתוב לו פונקציית >: class assignment { public: assignment(); assignment(int a_var, int a_val); bool operator <(const assignment &assign) const; int a_var, a_val; }; זהו טיפוס ה-set שאני מגדירה אח"כ: typedef set < assignment > nogoods; אלה הם ה-warnings: C:\Documents and Settings\Nakar\My Documents\Liat\OpenU\àéìåöéí\îîðéí\ôøåéé÷è\v3\Queens.cpp(67) : warning C4786: 'std::reverse_bidirectional_iterator<std::_Tree<assignment,assignment,std::set<assignment,std::less<assignment>,std::allocator<assignmen t> >::_Kfn,std::less<assignment>,std::allocator<assignment> >::const_iterator,assignment,assignment const &,assignment const *,int>' : identifier was truncated to '255' characters in the debug information C:\Documents and Settings\Nakar\My Documents\Liat\OpenU\àéìåöéí\îîðéí\ôøåéé÷è\v3\Queens.cpp(67) : warning C4786: 'std::pair<std::_Tree<assignment,assignment,std::set<assignment,std::less<assignment>,std::allocator<assignment> >::_Kfn,std::less<assig nment>,std::allocator<assignment> >::iterator,std::_Tree<assignment,assignment,std::set<assignment,std::less<assignment>,std::allocator<assignment> >::_Kfn,std::less<assignment>,std::allocator<assignment> >::iterator>' : identifier was truncated to '255' characters in the debug information C:\Documents and Settings\Nakar\My Documents\Liat\OpenU\àéìåöéí\îîðéí\ôøåéé÷è\v3\Queens.cpp(67) : warning C4786: 'std::pair<std::_Tree<assignment,assignment,std::set<assignment,std::less<assignment>,std::allocator<assignment> >::_Kfn,std::less<assig nment>,std::allocator<assignment> >::const_iterator,std::_Tree<assignment,assignment,std::set<assignment,std::less<assignment>,std::allocator<assignment> >::_Kfn,std::less<assignment>,std::allocator<assignment> >::const_iterator>' : identifier was t runcated to '255' characters in the debug information c:\program files\microsoft visual studio\vc98\include\xtree(174) : warning C4786: 'std::_Tree<assignment,assignment,std::set<assignment,std::less<assignment>,std::allocator<assignment> >::_Kfn,std::less<assignment>,std::allocator<assignment> >::_Tre e<assignment,assignment,std::set<assignment,std::less<assignment>,std::allocator<assignment> >::_Kfn,std::less<assignment>,std::allocator<assignment> >' : identifier was truncated to '255' characters in the debug information c:\program files\microsoft visual studio\vc98\include\xtree(182) : warning C4786: 'std::_Tree<assignment,assignment,std::set<assignment,std::less<assignment>,std::allocator<assignment> >::_Kfn,std::less<assignment>,std::allocator<assignment> >::~_Tr ee<assignment,assignment,std::set<assignment,std::less<assignment>,std::allocator<assignment> >::_Kfn,std::less<assignment>,std::allocator<assignment> >' : identifier was truncated to '255' characters in the debug information c:\program files\microsoft visual studio\vc98\include\xtree(162) : warning C4786: 'std::_Tree<assignment,assignment,std::set<assignment,std::less<assignment>,std::allocator<assignment> >::_Kfn,std::less<assignment>,std::allocator<assignment> >::_Tre e<assignment,assignment,std::set<assignment,std::less<assignment>,std::allocator<assignment> >::_Kfn,std::less<assignment>,std::allocator<assignment> >' : identifier was truncated to '255' characters in the debug information c:\program files\microsoft visual studio\vc98\include\xtree(236) : warning C4786: '__ehhandler$?insert@?$_Tree@Vassignment@@V1@U_Kfn@?$set@Vassignment@@U?$less@Vassignment@@@std@@V?$allocator@Vassignment@@@3@@std@@U?$less@Vassignment@@@4@V?$allocato r@Vassignment@@@4@@std@@QAE?AU?$pair@Viterator@?$_Tree@Vassignment@@V1@U_Kfn@?$set@Vassignment@@U?$less@Vassignment@@@std@@V?$allocator@Vassignment@@@3@@std@@U?$less@Vassignment@@@4@V?$allocator@Vassignment@@@4@@std@@_N@2@ABVassignment@@@Z' : identi fier was truncated to '255' characters in the debug information c:\program files\microsoft visual studio\vc98\include\xtree(236) : warning C4786: '__unwindfunclet$?insert@?$_Tree@Vassignment@@V1@U_Kfn@?$set@Vassignment@@U?$less@Vassignment@@@std@@V?$allocator@Vassignment@@@3@@std@@U?$less@Vassignment@@@4@V?$allo cator@Vassignment@@@4@@std@@QAE?AU?$pair@Viterator@?$_Tree@Vassignment@@V1@U_Kfn@?$set@Vassignment@@U?$less@Vassignment@@@std@@V?$allocator@Vassignment@@@3@@std@@U?$less@Vassignment@@@4@V?$allocator@Vassignment@@@4@@std@@_N@2@ABVassignment@@@Z$0' : identifier was truncated to '255' characters in the debug information c:\program files\microsoft visual studio\vc98\include\utility(21) : warning C4786: 'std::pair<std::_Tree<assignment,assignment,std::set<assignment,std::less<assignment>,std::allocator<assignment> >::_Kfn,std::less<assignment>,std::allocator<assignme nt> >::iterator,bool>::pair<std::_Tree<assignment,assignment,std::set<assignment,std::less<assignment>,std::allocator<assignment> >::_Kfn,std::less<assignment>,std::allocator<assignment> >::iterator,bool>' : identifier was truncated to '255' charact ers in the debug information Linking... Queens.exe - 0 error(s), 9 warning(s)
 

vinney

Well-known member
את יכולה להתעלם מC4786 הזה

זה אומר שהשם שנוצר עבור הדיבאגר ארוך מדי, זה לא משנה מבחינת התוכנה כלום, ואני מניח שלא תדבגי את set, אז לא משנה גם מבחינת הדיבגר.
 

® רן

New member
עצה בקשר לזה

תכניסי בראש הקובץ שורה:
#pragma warning (disable:4786)​
זה ישתיק את הודעת ה warning המיותרת. כפי שויני אמר, הקוד שלך בסדר גמור, הבעיה היא בדיבאגר של מיקרוסופט שלא מתמודד טוב עם טמפלטים עם שמות ארוכים.
 
למעלה