עבור לתוכן

מערכים ב-C++

Featured Replies

פורסם

שלום התחלתי ללמוד C++ (אחרי שלמדתי כבר C). אני לומד מהאתר eitan, ובקושי רשום שם על עבודה עם מערכים. איך למשל אני קורא לפונקציות operator עם מערך? (כדי להוסיף/להוריד איברים). או איך אני קורא לפונקצית בנאי/מפרק כשאני מוסיף או מוריד איברים? ובכלל לעשות כל מיני פעולות על המערך עצמו ולא על איבר ספציפי

ושאלה לא קשורה- סתם כדי לדעת בערך כמה זמן לוקח ללמוד את כל C++ אחרי שיודעים כבר את C (ברמה די טובה)?

פורסם

אי אפשר להוסיף או להוריד איברים ממערך, הגודל שלו קבוע.

מערכים כמעט ולא השתנו בין C ל-C++, למעט האופרטורים המשמשים להקצאת ושחרור זכרון (ב-C משתמשים ב-malloc ו-free, ב-C++ משתמשים ב-new ו-delete).

ההגבלה העיקרית על מערכים של אובייקטים היא שלאובייקטים חייב להיות default constructor (אחרת אתה חייב להשתמש במערך של מצביעים).

אם אתה רוצה מערכים דינאמיים, תלמד על vector.

והשאלה השנייה:

קצת קשה להגדיר "כל c++"... את כל ה-keywords אפשר ללמוד די מהר, אבל השפה מכילה עוד הרבה דברים (כגון STL), וחוץ מזה יש הרבה ללמוד בנושאי OOP שאינם קשורים ישירות לשפה, אלא יותר לתכנות עצמו.

פורסם

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

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

כל הזמן לומדים עוד ועוד, ב-C++ מתחבא המון כוח (ויש האומרים גם אי שפיות ממימד אחר!!!) וכל הזמן לומדים דברים חדשים. גם דרך העבודה עם C++ והשפה עצמה משתנים עם הזמן. היום עובדים עם C++ באופן שונה לגמרי ממה שחשבו לפני 10 ו-15 שנה. גם יש דברים חדשים כגון template metaprogramming וכו'.

פורסם
  • מחבר

אי אפשר להוסיף או להוריד איברים ממערך, הגודל שלו קבוע.

מערכים כמעט ולא השתנו בין C ל-C++, למעט האופרטורים המשמשים להקצאת ושחרור זכרון (ב-C משתמשים ב-malloc ו-free, ב-C++ משתמשים ב-new ו-delete).

ההגבלה העיקרית על מערכים של אובייקטים היא שלאובייקטים חייב להיות default constructor (אחרת אתה חייב להשתמש במערך של מצביעים).

אם אתה רוצה מערכים דינאמיים, תלמד על vector.

ברור שהתכוונתי למערך דינמי. ומה הכוונה תלמד על VECTOR? מה זה בכלל? וחוץ מזה מערכים דינמיים זה לא אותו עיקרון כמו ב-C? פשוט מגדירים מצביע לתחילת המערך ומקצים לו זכרון. אי אפשר ככה?

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

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

כל הזמן לומדים עוד ועוד, ב-C++ מתחבא המון כוח (ויש האומרים גם אי שפיות ממימד אחר!!!) וכל הזמן לומדים דברים חדשים. גם דרך העבודה עם C++ והשפה עצמה משתנים עם הזמן. היום עובדים עם C++ באופן שונה לגמרי ממה שחשבו לפני 10 ו-15 שנה. גם יש דברים חדשים כגון template metaprogramming וכו'.

בטח שלא התכוונתי כמה זמן לוקח לכסות את כללללל הנושאים ב-C++, אני יודע שזה מלא זמן. התכוונתי את כל התכונות הבסיסיות של השפה. בלי כל מיני "הרחבות" כמו למשל תיכנות בAPI, תיכנות בסוקטים, SDL וכל זה... מה שאני עושה זה לומד כל שפה רק את הבסיס החשוב, ואז עובר לשפה אחרת. ותוך כדי אני מתקדם במה שלמדתי כבר. למשל עכשיו אני גם עובד קצת על סוקטים ב-C.

פורסם

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

אני מדבר על דברים שבשפה כגון Exceptions, template metaprogramming, multiple inheritence, STL

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

וכן טכניקות שונות של design patterns.

אל תתרגש, יהיה לך הרבה זמן ללמוד, לאט לאט.

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

vector הוא חלק מספרית STL (שהיא חלק מ-C++). זו מחלקה (למעשה template) שמאפשרת לך להגיד מערכים שמשנים את גודלם באופן אוטמטי:

vector<int> v;

v.push_back( 5 );
v.push_back( 7 );
// now v holds 2 ints
v[0] = 3;
a = v[1];

v.resize(100);
// now v holds 100 ints
v[99] = 1;


ה-vector מנהל בעצמו את הזכרון ומבצע הקצאות זכרון בהתאם לצורך.

פורסם
  • מחבר

מוזר עד עכשיו תמיד השתמשתי במערכים דינמיים ב-C ולא ראיתי בשום מקום שכתוב שזה לא טוב. אז איזה דרך אחרת כדאי ליצור מערכים ב-C? אפשר לעשות מערך מצביעים אבל בכל מקרה זה יצטרך להיות דינמי כדי שיהיה אפשר להגדיל/להקטין אותו.

ואין דרך פשוטה יותר ליצור מערך ממה שרשמת כרגע? כי אתה מדבר איתי על דברים כמו STL, TEMPLATE, DESIGN PATTERN שאין לי מושג מהם, רק התחלתי ללמוד את כל הנושאים של המחלקות מהאתר. ואני מעדיף ללכת לפי הסדר ולא להתחיל להסתבך עם עוד נושאים אחרים. אחרי שאני יסיים את המדריך שמה אני אלמד STL (כי לא נראה לי שיש שם את זה). אבל אין איזה שיטה אחרת ליצירת מערכים בינתיים לתוכניות התרגול שאני עושה? או שעדיף כבר להשתמש במערכים סטטיים בינתיים?

Component תודה על המדריך

פורסם

בינתיים תעבוד עם הקצאת זכרון דינמית רגילה כמו שאתה מכיר.

תכנות זה מקצוע שלומדים אותו הרבה שנים, גם ב-C וגם ב-C++.

לאט לאט תלמד שיטות נוספות לעשות דברים חדשים.

פורסם
  • מחבר

כן אבל השאלה היא איך אני עושה פעולות על המערך? למשל אם אני רוצה להשתמש באופרטור ++ כדי לקרוא לפונקציה שתגדיל את המערך באחד, ותעלה את המשתנה הסטטי COUNT אפשר לעשות את זה? כאילו לקרוא לפונקצית חבר רק עם שם המערך ולא אובייקט יחיד?

פורסם

מה זאת אומרת "תגדיל את המערך באחד"?

תגדיל את גודל המערך?

תגדיל איבר במערך?

תגדיל את כל האיברים במערך?

פורסם
  • מחבר

הכוונה לגודל המערך. כאילו תוסיף איבר אחד (או יותר) למערך.

פורסם

כבר אמרנו, אי אפשר לעשות את זה.

אתה יכול לעשות את זה אם תשתמש ב-vector.

פורסם

בגדול ב-C ו-C++ למערכים יש גודל קבוע מהרגע שיוצרים אותם ועד לרגע שהורסים אותם.

אבל כמובן שיש יוצאי דופן ויש דרכים לעשות את מה שאתה רוצה.

אם זה מערך שהוקצה דינמית בעזרת malloc, אתה יכול להשתמש ב-realloc כדי לעשות את זה - realloc מקצה אזור זכרון חדש, מעתיק את המידע מהישן, ואז משחרר את הזכרון המקורי, ולבסוף מחזיר לך מצביע לזכרון החדש שהוקצה.

אבל אני ממליץ לך לא להשתמש בזה! בד"כ זה בדיוק הדרך הרעה לפתור בעיה.

עדיף לחזור אחורה ולבדוק מחדש את התכנון וההנחות שלך. למה בכלל אתה משתמש במערך? אם אתה כל הזמן צריך להגדיל את המערך שלך, אז כנראה שמערך זה לא מבנה הנתונים שאתה מחפש. אולי עדיף שתשתמש ברשימה מקושרת, לדוגמא?

אולי אתה יודע שלעולם לא יהיו יותר מ-MAX תאים במערך? במקרה זה עדיף להקצות מראש מערך בגודל MAX.

ארכיון

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

דיונים חדשים