עבור לתוכן

האם קיימת דרך להשתמש במשתנה מסוג string ב switch-case ? שפת ++c

Featured Replies

פורסם

הידור הקוד הבא:


//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 ?

תודה !

פורסם

חד-משמעית - אי אפשר. (וגם בין גרשיים (') יכול להופיע רק ערך של char, אף פעם לא string)

הדבר הכי קרוב לזה הוא hash table שבו המפתחות הם strings.

פורסם

פשוט מאוד, ב-switch אפשר לשים אך ורק משתנים פרימיטיביים.

זה כולל את כל המספרים למיניהם (int, char, long וכו') וגם מצביעים.

אני לא בטוח אם אפשר אפילו doubleים.

פורסם
  • מחבר

תודה על התשובה (למרות שהיא עצובה). :'(

פורסם

ב- switch חייבים לתת משתנה מסוג שהוא ordinal. הקומפיילר לא משאיר את הערכים שב- case, אלא מייצר סדרה של קפיצות אליהם.

מה רע ב- hash table?

פורסם

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

פורסם
  • מחבר

Boomerang:

מה רע ב- hash table?

אינני יודע מה זה ???

פורסם
כי בדרך כלל זה לא יהייה חד חד ערכי, ואם תתאמץ שזה כן יהייה, אז זמן הריצה יהייה גדול

hash table הוא כן חד-חד ערכי. זה שחלק מהמימוש הפנימי הוא לא כזה לא אומר שמבחוץ הוא לא חד-חד ערכי.

(תשובה לפותח הדיון) hash table זה מבנה נתונים שממפה בין אובייקטים (מפתחות) מסוג כלשהו שמקיים תנאים מסוימים (string הוא דוגמא) לבין אובייקטים כלשהם.

המיפוי נעשה ע"י גזירת ערך בגודל קבוע מהמפתח. פונקציה כזו נקראת פונקציית hash.(דוגמא מאוד פרימיטיבית - מיפוי integers למספרים 0 עד 99 ע"י מודולו 100)

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

בתנאים "בריאים" (כלומר - מספר התאים לא קטן מדי ופונקציית ה- hash היא בסדר), זמן החיפוש מתקרב ל- O(1).

עדיין - זה הרבה יותר כבד מ- switch עבור integers, אבל זה יותר מהיר מאוסף גדול של if ..else...

ב- STL יש לך class שנקרא hash_map שמממש את זה.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים