وکتورها (Vectors)
وکتور (Vector) یعنی آرایه قابل تغییر اندازه. مثل لیست خرید که می توانی چیز اضافه کنی یا کم کنی. پس با وکتورها، مدیریت داده ها راحت تر می شود.
تعریف سریع وکتور
وکتور یک «ساختار داده (Data Structure)» است. این ساختار چند مقدار هم نوع نگه می دارد. اما برعکس آرایه، اندازه اش می تواند تغییر کند.
نکته: برای استفاده، هدرِ <vector> لازم است.
#include <vector>
ساخت وکتور
نوع داده را داخل <> می نویسی. سپس نام وکتور را می دهی. می توانی مقداردهی اولیه هم انجام دهی.
vector<string> cars;
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
for (string car : cars) {
cout << car << "\n";
}
دسترسی به عناصر
ایندکس از صفر شروع می شود. بنابراین cars[0] اولین عنصر است.
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cout << cars[0];
cout << cars[1];
تابع های مفید هم داریم: .front() اولین، و .back() آخرین عنصر را می دهد.
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cout << cars.front();
cout << cars.back();
تابع .at() ایمن تر از براکت است. چون خطا را گزارش می کند.
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cout << cars.at(1);
cout << cars.at(2);
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cout << cars.at(6);
تغییر عنصر
می توانی با ایندکس مقدار را عوض کنی. البته .at() امن تر است.
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cars[0] = "Opel";
cout << cars[0];
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cars.at(0) = "Opel";
cout << cars.at(0);
افزودن و حذف
وکتور پویاست. با .push_back() آخرِ وکتور اضافه می کنی.
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cars.push_back("Tesla");
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cars.push_back("Tesla");
cars.push_back("VW");
cars.push_back("Mitsubishi");
cars.push_back("Mini");
برای حذف از آخر، از .pop_back() استفاده کن.
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cars.pop_back();
نکته: اگر باید از هر دو سر اضافه یا حذف کنی، دک (Deque) مناسب تر است.
اندازه و خالی بودن
تعداد عنصرها با .size() و خالی بودن با .empty() مشخص می شود.
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cout << cars.size();
vector<string> cars;
cout << cars.empty();
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cout << cars.empty();
حلقه روی وکتور
می توانی با for معمولی یا for-each پیمایش کنی.
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
for (int i = 0; i < cars.size(); i++) {
cout << cars[i] << "\n";
}
vector<string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
for (string car : cars) {
cout << car << "\n";
}
نکته: درباره پیمایش با ایتریتور (Iterator) بعداً می خوانی. برای مرور کلی، صفحه ساختارهای داده و STL را ببین. برای این بخش هم لینک وکتورها را نگه دار.
تمرین سریع: سه گام
- یک وکتور رشته ای بساز.
- چند ماشین اضافه کن.
- با for-each همه را چاپ کن.
جمع بندی سریع
- وکتور، آرایه قابل تغییر است.
- .push_back و .pop_back خیلی پرکاربردند.
- .at امن تر از براکت است.
- .size و .empty وضعیت را می گویند.
- for-each کد را خواناتر می کند.