دک (Deque)
دک در C++ یعنی صفِ دوطرفه. یعنی از دو سر کار می کند. می شود از جلو و عقب اضافه یا حذف کرد. همچنین با ایندکس هم دسترسی داری.
دک در C++ چیست؟
دک مخفف Double-Ended Queue است. یعنی «صف با دو سر». برخلاف صف معمولی، افزودن و حذف از هر دو طرف ممکن است. همچنین، با ایندکس عناصر را می خوانی.
#include <deque>
ساخت دک
با کلیدواژه deque و نوع داخل <> یک دک بساز.
std::deque<std::string> cars;
می توانی هنگام تعریف، با {} مقداردهی کنی. سپس با حلقه چاپ کن.
std::deque<std::string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
for (std::string car : cars) {
std::cout << car << "\n";
}
دسترسی با ایندکس و سرها
مثل آرایه، از [] استفاده کن. همچنین .front() و .back() هم هست.
std::deque<std::string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
std::cout << cars[0];
std::cout << cars[1];
std::deque<std::string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
std::cout << cars.front();
std::cout << cars.back();
تابع at برای دسترسی امن
تابع .at() اگر بیرونِ محدوده باشی، خطا می دهد. بنابراین امن تر است.
std::deque<std::string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
std::cout << cars.at(1);
std::cout << cars.at(2);
std::deque<std::string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
std::cout << cars.at(6);
تغییر مقدار عنصر
با ایندکس مقدار عوض می شود. یا امن تر، با .at() انجام بده.
std::deque<std::string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cars[0] = "Opel";
std::cout << cars[0];
std::deque<std::string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cars.at(0) = "Opel";
std::cout << cars.at(0);
افزودن و حذف از هر دو طرف
برای افزودن، از .push_front() و .push_back() استفاده کن.
std::deque<std::string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cars.push_front("Tesla");
cars.push_back("VW");
برای حذف، از .pop_front() و .pop_back() کمک بگیر.
std::deque<std::string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
cars.pop_front();
cars.pop_back();
اندازه و خالی بودن
با .size() تعداد عناصر را بگیر. با .empty() خالی بودن را بسنج.
std::deque<std::string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
std::cout << cars.size();
std::deque<std::string> a;
std::cout << a.empty();
std::deque<std::string> b = {"Volvo", "BMW", "Ford", "Mazda"};
std::cout << b.empty();
حلقه روی دک
می توانی با for و ایندکس Loop بزنی. یا از for-each استفاده کن.
std::deque<std::string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
for (int i = 0; i < cars.size(); i++) {
std::cout << cars[i] << "\n";
}
std::deque<std::string> cars = {"Volvo", "BMW", "Ford", "Mazda"};
for (std::string car : cars) {
std::cout << car << "\n";
}
تمرین سه مرحله ای
- یک دک رشته ای بساز.
- با push_front و push_back چند مقدار بده.
- با pop_front یکی حذف کن و front را چاپ کن.
نکته: اگر فقط انتها مهم است، وکتورها راحت ترند. اگر فقط FIFO می خواهی، صف ها بهترند. توضیح کاملِ دک در C++ همین صفحه است.
جمع بندی سریع
- افزودن و حذف از هر دو طرف.
- دسترسی با ایندکس هم ممکن است.
.at()امن تر از[]است..size()تعداد را می دهد و.empty()وضعیت را.