درودی دیگر به همراهان سایت رزدینو😉 با بخش پایانی سری آموزش زبان ++C در خدمت دوستان هستیم. این قسمت به مفاهیم مربوط به Collection یا همان مجموعه ها در c++ میپردازیم که همانند آرایهها هستند اما مزیتهایی دارند که عیبهای آرایهها را برطرف میکنند. پیشنهاد میکنم که قسمت مربوط به آرایهها را قبل از خواندن این پست مطالعه کنید.
مزیت مجموعه یا Collection چیست؟
برای تعریف آرایه ما باید نوع آن و همچنین تعداد عناصر آن را مشخص میکردیم. به کد زیر دقت کنید:
1 2 |
int a[10]; |
آرایه a از نوع int با طول 10 عنصر است. حال این دو عیب آرایه نمایان میشود:
- طول آرایه هنگام تعریف باید مشخص شود و اگر از تمام عناصر آن استفاده نکنیم، این امر باعث اشغال شدن حافظه میشود .
- به هیچ طریقی نمیتوان طول آرایه را تغییر داد. گاهی ممکن است بخواهیم عنصری را اضافه یا حذف کنیم.
برای حل دو مشکل فوق باید از مجموعه ها استفاده کرد که به مراتب مزیتهای بیشتری نسبت به آرایهها دارند.
انواع مجموعه ها در c++ و ساختار آنها
مجموعه ها در c++ در واقع کلاسهایی هستند که ما با ساختن یک شیء از آنها میتوانیم عناصری را به آن اضافه یا کم کنیم. فرم کلی تعریف یک Collection بصورت زیر است:
1 2 |
اسم مجموعه <نوع داده>نوع مجموعه; |
نوع داده همانند آرایهها است که باید مشخص کنیم چه نوع دادهای قرار است ذخیره شود. اسم مجموعه که نام مجموعه است و در واقع اینجا یک شیء است. اما میرسیم به نوع مجموعه ها در c++ که یکی از موارد زیر است:
- vector
- list
- deque
- arrays
- forward_list
- queue
- priority_queue
- stack
- set
- multiset
- map
- multimap
هر کدام از موارد بالا مزیتهای خود را دارند که بنده در این مطلب تنها مورد vector را توضیح میدهم. بقیه مجموعهها هرکدام خواص خاص خود را دارند که برای اطلاعات بیشتر در این زمینه به این لینک مراجعه کنید.
مجموعه vector
از بین تمام مجموعه ها در c++ ، این مجموعه پرکابردترین است که میتوان عناصر دلخواه با هر تعداد دلخواهی را درون آن ذخیره کرد. برای درک عملکرد این مجموعه به مثال زیر توجه کنید:
1 2 3 4 5 6 7 8 9 |
vector<int> vec; vec.push_back(12); vec.push_back(-35); vec.push_back(65); for (int i = 0; i < 3; i++) { cout << vec[i] << endl; } |
1 2 3 4 |
12 -35 65 |
vector یک کلاس است که نوع داده باید برای آن مشخص شود (ما int گذاشتیم). vec نام شیء ساخته شده از کلاس است. توجه شود که طبق توضیحات آموزشهای بخش شیء گرایی، چون سازنده را ننوشتیم، سازنده پیشفرض صدا زده میشود تا شیء vec مقداردهی اولیه شود. کلاس vector متدهای زیادی برای عملیاتهای کاری دارد که اولین آن متد push_back است. با این متد میتوان عنصری جدید به مجموعه اضافه کرد. دقت شود عنصری که به درون آرگمان push_back فرستاده میشود دقیقا باید همانند نوع داده باشد.
نکته: برای دسترسی به المانهای مجموعه، همانند آرایهها باید از [ ] استفاده کرد. دقت کنید که اگر عدد داخل [ ] خارج از محدوده باشد، کامپایلر ارور میدهد.
متد push_back
این متد به آخر مجموعه یک المان جدید اضافه میکند.
1 2 |
vec.push_back(15); |
در خط فوق عدد 15 به آخر مجموعه اضافه شد. اگر مجموعه عضوی نداشته باشد، عدد 15 اولین عضو وارد شده است.
متد back
این متد آخرین عنصر مجموعه را برمیگرداند.
1 2 3 4 |
vec.push_back(15); vec.push_back(-10); cout << vec.back() << endl; |
1 2 |
-10 |
متد front
این متد برعکس متد back است و اولین عضو مجموعه را برمیگرداند.
1 2 3 4 |
vec.push_back(15); vec.push_back(-10); cout << vec.front() << endl; |
1 2 |
15 |
متد assign
این متد به تعداد مشخصی، یک عنصر مشخص را درون مجموعه قرار میدهد. اولین آرگومان آن تعداد و دومین آرگومان آن عنصری است که میخواهیم درون مجموعه به همان تعداد تکرار شود.
1 2 3 4 5 |
vec.assing(3, 1); for (int i = 0; i < 3; i++) { cout << vec[i] << endl; } |
1 2 3 4 |
1 1 1 |
متد size
این متد تعداد المانهای درون مجموعه را برمیگرداند.
1 2 3 4 5 |
vec.push_back(15); vec.push_back(-10); vec.push_back(13); cout << vec.size() << endl; |
1 2 |
3 |
متد at
این متد همانند عملکرد [ ] است و تنها میتوان عنصر مورد نظر را خواند.
1 2 3 4 5 |
vec.push_back(15); vec.push_back(-10); vec.push_back(13); cout << vec.at(2) << endl; |
1 2 |
13 |
متد clear
این متد تمام عناصر مجموعه را پاک میکند.
1 2 3 4 5 |
vec.push_back(14); vec.push_back(-1); vec.clear(); cout << "size is " + vec.size() << endl; |
1 2 |
size is 0 |
متد empty
این متد یک مقدار bool برمیگرداند که اگر true باشد به معنای این است که مجموعه خالی بوده و هیچ المانی ندارد. در غیر این صورت false را خروجی میدهد.
1 2 3 4 |
vec.clear(); if (vec.empty() == true) cout << "vec is empty" << endl; else cout << "vec is not empty" << endl; |
1 2 |
vec is empty |
متد begin و متد end
متد begin آدرس اولین عنصر مجموعه را برمیگرداند و متد end آدرس آخرین عضو از مجموعه را به ما میدهد.
1 2 3 4 5 6 7 |
for (int i = 1; i <= 5; i++) { vec.push_back(i); } cout << *(vec.begin()) << endl; cout << *(vec.end()-1) << endl; |
1 2 3 |
1 5 |
()vec.begin آدرس اولین عضو مجموعه است که برای دسترسی به مقدار آن باید از * قبل از آن استفاده کرد (مطابق آموزش بخش هشتم). ()vec.end آدرس خانهای را برمیگرداند که محل قرارگیری عنصر جدید احتمالی است. پس آخرین عنصر vec.end() – 1 میباشد.
متد insert
یکی از بهترین متدها است. گاهی اوقات میخواهیم بین عناصر آرایه عضوی را قرار دهیم. در آرایهها این امکان وجود نداشت اما با استفاده از Collection ها و متد insert این کار ممکن شده است. اولین آرگومان آدرس خانهای است که میخواهیم عضوی در آن قرار گیرد و دومین آرگومان عضو جدید است.
1 2 3 4 5 6 7 8 9 10 |
for (int i = 1; i <= 5; i++) { vec.push_back(i); } vec.insert(vec.begin() + 2, 666); for (int i = 0; i < vec.size(); i++) { cout << vec[i] << endl; } |
1 2 3 4 5 6 7 |
1 2 666 3 4 5 |
در حلقه for اعداد 1 تا 5 را درون vec قرار دادیم. در خط بعدی با متد insert عدد 666 را در مکان 2 جایگذاری کردیم. دقت شود که vec.begin آدرس خانه صفرم را برمیگرداند. پس اگر با 2 جمع شود، آدرس نهایی عضو دوم است. در نهایت حلقه for دوم به تعداد ()vec.size تکرار شده و عضوها را به ترتیب چاپ میکند.
متد erase
این متد عنصر مشخصی از مجموعه را حذف میکند. همچنین میتوان مجموعهای از عناصر را حذف کرد. اولین آرگومان آدرس اولین خانهای است که باید حذف شود و دومین آرگومان آدرس آخرین خانه که میخواهیم تا آنجا از مجموعه را پاک کنیم. اگر تنها اولین آرگومان فرستاده شود، فقط آن عضو پاک خواهد شد.
1 2 3 4 5 6 7 8 9 10 |
for (int i = 1; i <= 5; i++) { vec.push_back(i); } vec.erase(vec.begin() + 3); for (int i = 0; i < vec.size(); i++) { cout << vec[i] << endl; } |
1 2 3 4 5 |
1 2 3 5 |
اولین overload متد erase یک آرگومان میگیرد و تنها آن آدرس را پاک میکند. در المان آدرس خانه 3 که عضو چهارم است پاک میشود. دومین overload آدرس ابتدا و انتها که قرار است پاک شوند را میگیرد.
1 2 |
vec.erase(vec.begin() + 1, vec.begin() + 3); |
1 2 3 4 |
1 4 5 |
نتیجه گیری و حرف آخر
دوستان آخرین بخش هم به اتمام رسید. هرگونه انتقاد و نظری که دارید را برام کامنت بزارید ممنون میشیم🙏 اگر کم و کاستی وجود داشت به بزرگی خودتون ببخشید و به اطلاع ما برسانید تا بتوانیم در آموزشهای بعدی بهتر و با کیفیت تر ظاهر بشیم. همچنین اگر سوالی در مورد مجموعه ها در c++ دارید حتما در بخش نظرات مطرح کنید تا تیم ما در اسرع وقت پاسخگوی شما عزیزان باشه.
در این سری از آموزش سعی شده بود تا مواردی که برای برنامه نویسی های پیشرفته اعم از پردازش تصویر یا پردازش صوت احتیاج است بیان شود. همچنین شما میتوانید یک پله بالاتر از این زبان یعنی زبان #C که هم اکنون آموزش های آن بر روی سایت قرار دارد را فرا بگیرید. سلامت و تندرست باشید👋
3 پاسخ
خیلی کامل و عالی بود متشکرم
مچکرم. هرگونه سوال یا ابهامی بود میتونید از طریق پشتیبانی اقدام کنید.
اموزش هاتون خیلی مفید بودند ممنونم