|ל| הממ שאלה קטנה

Mapisto

New member
|ל| הממ שאלה קטנה

נגיד ואני מצהיר על פוינטר int * x; האם זה חוקי לכתוב x[4] = 3; ?
 

אלדד28

New member
תלוי מה יש בין שתי השורות

קודם כל, זה שאתה מצהיר על x כעל מצביע ל-int זה לא עושה יותר מדי. x מלא בזבל. אתה צריך לאתחל אותו במשהו. עכשיו, אם (לגמרי במקרה...) המשהו יהיה מערך שגודלו יותר מ-5, אז [x[4 יהיה תקין. למשל:
int *x; x = (int *)malloc(10*sizeof(int)); if (NULL != x) { x[4] = 3; }​
זה בסדר. אבל אם לא איתחלת את x, שום שימוש בו לא יהיה טוב.
 

זאינאל

New member
כן, אבל זה לא אומר שזה יהיה נכון.

אם לא השמת ל-i אזור זכרון מספיק גדול להחזיק 5 intים, אז תקבל שגיאת חריגה מהזכרון.
 

Mapisto

New member
הממ אני פשוט לא מבין את הקוד הבא

template <class T> // declare the template and the parameter class Array // the class being parameterized { public: Array(int itsSize = DefaultSize); Array(const Array &rhs); ~Array() { delete [] pType; } // operators Array& operator=(const Array&); T& operator[](int offSet) { return pType[offSet]; } const T& operator[](int offSet) const { return pType[offSet]; } // accessors int GetSize() const { return itsSize; } // friend function friend ostream& operator<< (ostream&, const Array<T>&); private: T *pType; int itsSize; };​
שימו לב שיש pType[i
template <class T> Array<T>::Array(int size = DefaultSize): itsSize(size) { pType = new T[size]; for (int i = 0; i<size; i++) pType = (T)0; } template <class T> Array<T>& Array<T>::eek:perator=(const Array &rhs) { if (this == &rhs) return *this; delete [] pType; itsSize = rhs.GetSize(); pType = new T[itsSize]; for (int i = 0; i<itsSize; i++) pType = rhs; return *this; } template <class T> Array<T>::Array(const Array &rhs) { TRACE("Array<T>::Array(const Array &rhs)\n"); itsSize = rhs.GetSize(); pType = new T[itsSize]; for (int i = 0; i<itsSize; i++) pType = rhs; } template <class T> ostream& operator<< (ostream& output, const Array<T>& theArray) { for (int i = 0; i<theArray.GetSize(); i++) output << "[" << i << "] " << theArray << endl; return output; }
 

Mapisto

New member
הבנתי הבנתי

pType = new T[itsSize];​
הוא יוצר מערך בזיכרון החופשי...
 

אלדד28

New member
multimap יכול להחזיק ערכים כפולים

בתור keys, ולא רק כניסה אחת לכל ערך. אותו דבר לגבי set ו-multiset.
 

Mapisto

New member
WTF???

multimap(string,int) x; x["eldad"] = 4; x["eldad"] = 5;​
מה זאת אומרת ערכים כפולים?
 

אלדד28

New member
נו באמת ../images/Emo6.gif

אתה לא יכול להשתמש ב-multimap כבתור מערך אסוציאטיבי. זה משהו ששמור ל-map בלבד. שימוש אחד לגיטימי ל-multimap הוא למשל מילון - הרי יש לך כמה הגדרות למילה אחת. זה נוח גם כי זה דו כיווני - כלומר, יכולים להיות ערכים כפולים גם ב-first וגם ב-second.
 
תחשוב על ספר טלפונים

ספר_טלפונים["כהן"] = "אבי" ספר_טלפונים["כהן"] = "משה" חוקי ואף שימושי, לא? (יש הרבה דרבים ליישם ספר טלפונים, אבל עדיין זו אחת מהן...)
 

Mapisto

New member
אוקיי עד כאן הכל סבבה

אבל איך אני יכול לקבל למה ספר_טלפונים["כהן"] שווה?
 
אתה תקבל

איטרטור לאיבר הראשון שמתאים למפתח "כהן". ואם תקדם את האיטרטור, תגיע לאיבר השני שמתאים למפתח "כהן" וכך הלאה.
 

אלדד28

New member
הדבר היחיד שתקבל אם תנסה את זה

הוא שגיאת קומפילציה. multimap לא מגדיר []operator. אתה יכול להשתמש ב-("find("value של multimap, אם אתה רוצה להגיע לאיטרטור הראשון של value (כמובן לא חייב להיות string...).
 
למעלה