Menu
Coddy logo textTech

וקטור

שיעור 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()מוסיפה איבר שצוין במיקום שצוין
challenge icon

אתגר

קל

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

לדוגמה:

 

Input
5
10
15
-1
100
Output
5
10

כי 100 מתחלק ב-5 וב-10, אבל לא ב-15

 

Input
2
4
6
8
-1
12
Output
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++ אונליין