פורסם 2005 ביוני 1220 שנים הידור הקוד הבא://temp.cpp#include <string>using std::string;#include <iostream>using std::cout;int main(){ string myS="sss"; switch (myS) { case 'sss': cout << "hi !"; } return 0;}יוצר את הודעת השגיאה הבאה:"Switch selection expression must be of integeral type"שממנה אני למד שניתן להשתמש במשתנה מסוג int בלבד ב switch-case. מישהו יודע אם וכיצד משתמשים ב string ב switch-case ?תודה !
פורסם 2005 ביוני 1220 שנים חד-משמעית - אי אפשר. (וגם בין גרשיים (') יכול להופיע רק ערך של char, אף פעם לא string)הדבר הכי קרוב לזה הוא hash table שבו המפתחות הם strings.
פורסם 2005 ביוני 1220 שנים פשוט מאוד, ב-switch אפשר לשים אך ורק משתנים פרימיטיביים.זה כולל את כל המספרים למיניהם (int, char, long וכו') וגם מצביעים.אני לא בטוח אם אפשר אפילו doubleים.
פורסם 2005 ביוני 1220 שנים ב- switch חייבים לתת משתנה מסוג שהוא ordinal. הקומפיילר לא משאיר את הערכים שב- case, אלא מייצר סדרה של קפיצות אליהם.מה רע ב- hash table?
פורסם 2005 ביוני 1220 שנים כי בדרך כלל זה לא יהייה חד חד ערכי, ואם תתאמץ שזה כן יהייה, אז זמן הריצה יהייה גדול.
פורסם 2005 ביוני 1220 שנים כי בדרך כלל זה לא יהייה חד חד ערכי, ואם תתאמץ שזה כן יהייה, אז זמן הריצה יהייה גדולhash table הוא כן חד-חד ערכי. זה שחלק מהמימוש הפנימי הוא לא כזה לא אומר שמבחוץ הוא לא חד-חד ערכי.(תשובה לפותח הדיון) hash table זה מבנה נתונים שממפה בין אובייקטים (מפתחות) מסוג כלשהו שמקיים תנאים מסוימים (string הוא דוגמא) לבין אובייקטים כלשהם.המיפוי נעשה ע"י גזירת ערך בגודל קבוע מהמפתח. פונקציה כזו נקראת פונקציית hash.(דוגמא מאוד פרימיטיבית - מיפוי integers למספרים 0 עד 99 ע"י מודולו 100)יש כמה דרכים להתמודד עם התנגשויות (כלומר - ששני מפתחות ממופים לאותו תא) - הדרך הכי פשוטה היא פשוט לשמור בכל תא רשימה של זוגות המפתחות והאובייקטים שהתאימו. בכל אופן, זה ממומש בתוך מבנה הנתונים.בתנאים "בריאים" (כלומר - מספר התאים לא קטן מדי ופונקציית ה- hash היא בסדר), זמן החיפוש מתקרב ל- O(1).עדיין - זה הרבה יותר כבד מ- switch עבור integers, אבל זה יותר מהיר מאוסף גדול של if ..else...ב- STL יש לך class שנקרא hash_map שמממש את זה.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.