וקטור
שיעור 5 מתוך 23 בקורס C++ - ספריית התבניות הסטנדרטית של Coddy.
Vector ב־C++ STL הוא למעשה מערך שגודלו משתנה באופן דינמי. יש לו יכולת לשנות את גודלו באופן אוטומטי כשמוסיפים או מסירים ממנו איבר. איברי ה־Vector מאוחסנים במיקומים רציפים בזיכרון, ולכן אפשר לגשת אליהם, לשנות אותם ולעבור עליהם באמצעות איטרטורים.
ב־Vector, הנתונים מתווספים מהסוף. זהו מבנה נתונים איטי יותר ממערך, אך ה־Vector מהיר מספיק לשימוש בפתרון בעיות, אפילו בתחרויות תכנות ברמת קושי גבוהה.
מממשים Vectors ב־C++ באמצעות הוספתם בראש הקובץ בעזרת #include <vector>.
!שימו לב: ב־C++ יש קובץ כותרת לא סטנדרטי בשם bits/stdc++.h. אפשר לכלול אותו בראש קובץ C++ ולהשתמש בכל אחד מרכיבי הספרייה הסטנדרטית בלי לכלול אותם בנפרד. (#include <bits/stdc++.h)
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// קוד...
return 0;
}#include <bits/stdc++.h>
using namespace std;
int main()
{
// קוד...
return 0;
}אז איך יוצרים, מאתחלים ומשתמשים ב־Vector? משתמשים במילת המפתח vector<>. בתוך <> מציינים את סוג המשתנה, כלומר את סוג הנתונים של האיברים שנרצה לאחסן בתוך ה־Vector. אם נרצה להצהיר על Vector שיאחסן מספרים שלמים, נשתמש ב־vector<int>.
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> numbers = {1, 2, 3};
cout << numbers[0];
return 0;
}Output:
1כפי שאפשר לראות למעלה, Vectors מתנהגים בדיוק כמו מערכים. הצהרנו על Vector מסוג int בשם numbers ואִתחלנו אותו בכמה ערכים. לאחר מכן, באמצעות סוגריים מרובעים — [] — הצגנו את האיבר הראשון, כלומר את האיבר באינדקס 0.
מוסיפים איברים לסוף ה־Vector באמצעות הפונקציה push_back(). המתודה push_back() מוסיפה איבר חדש אחרי האיבר האחרון ב־Vector.
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> numbers = {1, 2, 3};
cout << numbers[2] << endl;
numbers.push_back(10);
cout << numbers[3];
return 0;
}Output:
3
10כפי שאפשר לראות, משתמשים במתודה באמצעות שם ה־Vector ונקודה — .. לאחר השימוש במתודה push_back(), גודל ה־Vector גדל באחד.
יש לנו גם את המתודה size(), שבה אפשר להשתמש כדי לקבל את מספר האיברים שיש ב־Vector.
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> numbers = {1, 2, 3};
cout << numbers.size();
return 0;
}Output:
3לעיתים קרובות משתמשים במתודה size() כשלא יודעים כמה איברים יש ב־Vector, אך רוצים לעבור עליהם בלולאה. במקרה כזה משתמשים בתנאי הלולאה ב־vector.size().
למבנה הנתונים Vector יש פונקציות ותכונות רבות. למשל, הפונקציה resize(n) משנה את גודל ה־Vector ל־n, ויש עוד רבות. נחזור אליהן כשנלמד על אלגוריתמים ופונקציות. לעת עתה, זכרו ש־Vectors הם מערכים שגודלם משתנה באופן דינמי, איך להצהיר עליהם ושמוסיפים להם איברים חדשים באמצעות המתודה push_back().
דוגמה: להלן תוכנית לדוגמה שבה המשתמש ימשיך להזין מספרים עד שיזין -1. נשתמש בלולאה וב־Vector כדי לאחסן אותם, כי איננו יודעים מראש כמה איברים יהיו.
#include <bits/stdc++.h>
using namespace std;
int main()
{
int x;
vector<int> numbers;
while(x != -1)
{
cin >> x;
numbers.push_back(x);
}
return 0;
}בכל שיעור תוצג לכם טבלה של המתודות שאפשר להשתמש בהן עם מבנה הנתונים המסוים ב־C++.
מתודות של Vector
| מתודה | תפקיד |
| push_back() | מוסיפה איבר חדש לסוף ה־Vector |
| pop_back() | מסירה את האיבר האחרון מה־Vector |
| swap() | מחליפה בין האיברים שצוינו |
| front() | מחזירה הפניה לאיבר הראשון |
| back() | מחזירה הפניה לאיבר האחרון |
| empty() | קובעת אם ה־Vector ריק או לא |
| clear() | מסירה את כל האיברים מה־Vector |
| resize() | משנה את גודל ה־Vector |
| size() | מחזירה את מספר האיברים ב־Vector |
| insert() | מוסיפה איבר שצוין במיקום שצוין |
אתגר
קלמזינים מספרים חיוביים עד שלא מזינים -1. לאחר מכן, המספר הטבעי האחרון שהוזן, N, הוא מספר ההקשר שלך. הצג כל איבר ש-N מתחלק בו ללא שארית
לדוגמה:
Input
5
10
15
-1
100Output
5
10כי 100 מתחלק ב-5 וב-10, אבל לא ב-15
Input
2
4
6
8
-1
12Output
2
4
6כי 12 מתחלק ב-2, ב-4 וב-6, אבל לא ב-8
נסו בעצמכם
#include <vector>
#include <iostream>
using namespace std;
int main()
{
// Enter your code here
return 0;
}כל השיעורים ביחידה C++ - ספריית התבניות הסטנדרטית
תרגלו בעצמכם: קומפיילר C++ אונליין