
کلاس وکتور (vector) در سی پلاس پلاس
وکتور (vector) یکی از کلاس های خیلی خوب سی پلاس پلاس است که استفاده از آن نوشتن خیلی از برنامه ها را آسان می کند. ما در این مطلب به بررسی ساختار داده انتزاعی vector می پردازیم و استفاده از آن در کدنویسی را مرور می کنیم.
فهرست مطالب
- 1 مقدمه
- 2 آشنایی با کتابخانه کلاس vector
- 2.1 هدر کتابخانه vector
- 2.2 تعریف شئ vector
- 2.3 دسترسی به عناصر یک vector
- 2.4 اندازه یک شئ vector
- 2.5 ظرفیت یک شئ وکتور vector
- 2.6 بیشترین طول ممکن برای یک شئ vector
- 2.7 تغییر اندازه یک vector
- 2.8 اضافه کردن به انتهای vector
- 2.9 برداشتن آخرین عنصر داخل vector
- 2.10 دیدن مقدار اولین و آخرین عنصر داخل vector
- 2.11 پاک کردن تمام مقادیر داخل vector
مقدمه
این ساختار داده، تا حدودی مانند آرایه است با این تفاوت که می شود حین برنامه به صورت پویا به عناصر آن اضافه و یا از آن ها کم کرد و مدیریت طول آن را به خود شئ سپرد. هم چنین متد های زیادی دارد که باعث می شود وقتمان را برای نوشتن متد برای کار با آریه های با طول ثابت معمولی، هدر ندهیم .
به جای لیست پیوندی در خیلی از جاها می شود از وکتور هم استفاده کرد و از درد سرهای لیست پیوندی کاست.
آشنایی با کتابخانه کلاس vector
هدر کتابخانه vector
برای استفاده از وکتور باید هدر آن را پیوست برنامه کرد :
1 | #include <vector> |
تعریف شئ vector
فرض کنید می خواهیم وکتوری به اسم test شامل ۱۰ خانه از نوع int تعریف کنیم که مقدار اولیه همه خانه ها ۰ است:
1 | vector <int> test(10,0); |
دسترسی به عناصر یک vector
1 | test[5]; |
۲-با استفاده از تابع عضو at :
1 | test.at(5); |
استفاده از at بهتر است چون اگر ایندکسی خارج از سایز را وارد کنیم، برنامه به طور هوشمند خطا می دهد و مشکلی برای داده های دیگر حافظه رخ نمی دهد. ولی در حالت یک چنین اتفاقی نمی افتد و می تواند موجب قطع کامل اجرای برنامه شود.
در بالا از سایز اسم بردم پس بگذارید شما را با دو اصطلاح آشنا کنم :
اندازه یک شئ vector
سایز (size) : سایز همان تعداد خانه هایی است که ما در آن ها مقدار داریم. در وکتوری که بالاتر ما ایجاد کردیم سایز ۱۰ است (که در ابتدای تعریف همه با صفر پر شده اند). برای دریافت مقدار سایز تابع عضو (متد) size را داریم که استفاده از آن به این شکل است :
1 | test.size(); |
حالا اگه آن را در دستور خروجی قرار بدهیم مقدار ۱۰ را نشان می دهد:
1 | cout<<test.size(); |
ظرفیت یک شئ وکتور vector
ظرفیت (capacity): فرض کنید که ما بخواهیم یک مقدار جدید اضافه کنیم و این کار را چند بار انجام دهیم. کمی وقت می گیرد تا از حافظه بخشی را برای آن جدا کند به همین خاطر در وکتور تعدادی خانه را آماده نگه می دارد برای وقتی که خواستیم به طول آن اضافه کنیم برای پی بردن به ظرفیت از تابع عضو capacity() استفاده می کنیم:
1 | test.capacity(); |
اگر آن را در خروجی چاپ کنیم مقدار ۱۲ را بر می گرداند که دوتا از سایز بزرگ تر است یک سوال پیش می آید با خود می گوییم اگر دو مقدار جدید دیگر اضافه کردیم و ظرفیت پر شد چه می شود؟ جواب ساده است آنگاه خود شئ، دوباره ظرفیت را زیاد می کند (هر دفعه دو برابر قبل).
بیشترین طول ممکن برای یک شئ vector
حالا نوبتی هم باشد، نوبت ()max_size این تابع عضو بیشرین طول ممکن برای ایجاد یک وکتور را می گوید که اندازه آن به مشخصات سیستم مربوط می شود:
1 | test.max_size(); |
تغییر اندازه یک vector
حالا به سراغ تابع عضو ()resize می رویم که یکی از توابع بسیار کاربردی است. فرض کنید در وکتور test با سایز ۱۰ ما ۴ خانه آخر را نخواهیم یا ۴ خانه کم داشته باشیم و بخواهیم اضافه کنیم :
1 2 | test.resize(6); test.resize(14); |
در دستور اول سایز را به ۶ کاهش دادیم و در دستور بعدی سایز به ۱۴ تا افزایش داده شده است.
دو تابع عضو دیگر هم به اسم push_back و pop_back را هم داریم که کار اضافه کردن و کم کردن مقدار جدید به آخر وکتور را دارند:
اضافه کردن به انتهای vector
۱-تابع عضو push_back:
1 | test.push_back(8); |
با دستور بالا یک خانه به آخر وکتور با مقدار ۸ اضافه می شود و به سایز هم یکی اضافه می شود.
برداشتن آخرین عنصر داخل vector
۲-تابه عضو pop_back :
1 | test.pop_back(); |
با این دستور خانه آخر وکتور از بین می رود و از سایز هم یکی کم می شود.
دیدن مقدار اولین و آخرین عنصر داخل vector
تابع های عضو back و front هم خانه های آخر و اول وکتور را تعیین می کنند:
1 2 | test.front(); test.at(0); |
دو دستور بالا با هم برابرند و هر مقدار عنصر سر وکتور را نشان می دهد.
پاک کردن تمام مقادیر داخل vector
برای نابود کردن یک وکتور هم از تابع عضو clear استفاده می کنیم:
1 | test.clear(); |
در زیر هم یک کد کامل از تمام چیز هایی که گفته شد آمده است.
مثالی از قابلیت های وکتور vector در سی پلاس پلاس:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | #include <iostream> #include <vector> #include <algorithm> //============================================= class classtest { public: classtest() { x = 2, y = 3; } int getx() { return x; } int gety() { return y; } void setx(int interData) { x = interData; } void sety(int interData) { y = interData; } private: int x; int y; } ex; using namespace std; int main() { // test .at() .size() .capacity() .max_size() cout << ".at() .size() .capacity() .max_size() :" << endl; unsigned int i, j; vector<int> test(12, 5); for (i = 0; i < test.size(); i++) { cout << test.at(i) << " " << test.capacity() << " " << endl; test.at(i) = i; } // test resize cout << "resize :" << endl; cout << endl; test.resize(15); for (i = 0; i < test.size(); i++) { cout << i << " " << test.at(i) << " " << test.capacity() << " " << endl; test.at(i) = i; } // test .reserve() // increase .reserve() cout << endl; cout << "increase .reserve() inc" << endl; test.reserve(30); for (i = 0; i < test.size(); i++) { cout << test.at(i) << " " << test.capacity() << " " << endl; test.at(i) = i; } // decrease .reserve() //no Work cout << ".reserve(): no Work dec" << endl; cout << endl; test.reserve(0); for (i = 0; i < test.size(); i++) { cout << test.at(i) << " " << test.capacity() << " " << endl; test.at(i) = i; } //.push_back(x) cout << ".push_back: " << endl; test.push_back(12); cout << endl; for (i = 0; i < test.size(); i++) { cout << test.at(i) << " " << test.capacity() << " " << endl; test.at(i) = i; } // .pop_back cout << ".pop_back: " << endl; test.pop_back(); cout << endl; for (i = 0; i < test.size(); i++) { cout << test.at(i) << " " << test.capacity() << " " << endl; test.at(i) = i; } //.back() and .front() cout << ".back() and .front(): " << endl; cout << "First:" << test.front() << " Last:" << test.back() << endl; // array sort: sort(arr,arr+n); // vector sort: cout << "sort(): " << endl; test.push_back(3); sort(test.begin(), test.end()); cout << endl; for (i = 0; i < test.size(); i++) { cout << test.at(i) << " " << test.capacity() << " " << endl; test.at(i) = i; } // insert cout << ".insert(): " << endl; test.insert(test.begin(), 30, 9); cout << endl; for (i = 0; i < test.size(); i++) { cout << test.at(i) << " " << test.capacity() << " " << endl; test.at(i) = i; } cout << "\nEnter any key to continue." << endl; cin.get(); // .clear() test.clear(); // clear screen system("CLS"); // vector in vector vector<int> test0(15, 5); vector<vector<int> > test1(10); for (i = 0; i < test1.size(); i++) { test0.resize(15 - i); test1.at(i) = test0; } // access in internal cout << (test1.at(1)).at(1) << endl; for (i = 0; i < test1.size(); i++) { for (j = 0; j < (test1.at(i)).size(); j++) { cout << " " << (test1.at(i)).at(j); } cout << endl; } cout << "\nEnter any key to continue." << endl; cin.get(); // clear screen system("CLS"); // .clear() test0.clear(); test1.clear(); // vector with class vector<classtest> test2(10, classtest()); for (i = 0; i < test2.size(); i++) { cout << (test2.at(i)).getx() << " " << (test2.at(i)).gety(); } return 0; } |
سلام ،میخواستم بدونم توی وکتور مثلا دستوری هست که لیست ایجادی وکتور رو inverse کنه یعنی:١٢٣۴ رو بکنه ۴٣٢١
سلام
برای این کار یک تابع داخل کتابخانه algorithm به نام reverse وجود داره که هم روی vector کار می کنه و هم روی آرایه های معمولی.
اول کتابخانه algorithm رو اضافه (اینکلود) کنید و بعد برای استفاده از تابع reverse ابتدا و انتهای وکتور رو به عنوان آرگومان بهش پاس بدید. مثال:
عالی بود
خدا عمرت بده اگه به این سایت سرزدی جواب ما رو هم بده .
آیا می شه یه وکتور از کلاسی که چند نوع مختلف داره ایجاد کرد .
سلام نه مگر اینکه اون کلاس ها توی ارث بری یک پدر مشترک داشته باشند. به مطالب آموزشی با عنوان “چند ریختی در سی پلاس پلاس” سر بزنید.
کوتاه مختصر مفید
سپاس گذارم
مطالبتون عالیه
مطالب عالی بود خیلی خیلی ممنون
خیلی ممنون . بسیار مفید بود
سلام
بابت مطالب مفید سایتتون بسیار متشکرم.
هر بار که مطلبی رو متوجه نشم به سایت شما سر میزنم وقتی ببینم اون مطلبو داره مطمئن میشم که یادش میگیرم. واقعا که عالیه
سلام تو codeblocks
size و capacity رو هم اندازه میگیره. یعنی اگه سایز رو ده نشون بده دیگه capacity دوازده نشون نمیده.چرا؟
این کد را اجرا کنید – خواهید دید که الزاما برابر نیستند.
برای مطالعه ی بیشتر به آدرس زیر بروید:
http://stackoverflow.com/questions/6296945/size-vs-capacity-of-a-vector
برای این که بخواهیم وکتور ما شامل چند تا داده باشه چی ؟
مثلا یه دونه اینتیجر و یه دونه استرینگ
یک Data type انتزاعی جدید با اسفاده از class یا struct می سازید که شامل هم رشته و هم عدد صحیح باشد و شئ vector را از جنس اون Data type تعریف و ایجاد می کنید!
در خط ۳۲ ، ex چیه؟
یک شی از کلاس classtest است
سلام
من باید برنامه درخت متوازن رو بنویسم مربوط به درس ذخیرست
میخوام توی نود هام به جای یک فیلد چند فیلد بذارم میشه بګید باید چیکار کنم؟
منظورتون رو دقیق نفهمیدم، یک کلاس جدید تعریف کن که شامل چند فیلد باشد و آن کلاس را درون وکتور بریزید.
مهمترین دستور قسمت insert رو توضیح ندادید!
سلام
آیا تابعی وجود داره که یه وکتور از وکتور هایی بسازه که سایزشون یکی نیست؟
پیدا نکردم ، ولی با لینک لیست می تونی
یه سوال داشتم.استادمون یه پروژه دادن با این موضوع که کوتاهترین مسیر(منظورم کمترین هزینه س ) بین دو شهر رو پیدا کنید.گفتن برای پیاده سازی گراف ها از لینک لیست استفاده کنید.الان اگر من به جای لینک لیست از وکتور استفاده کنم ایشون میتونن از نمره پروژم کم کنن ؟
میخواستم بدونم میزان مصرف حافظه برای چنین پروژه ای چقدره؟(با استفاده از الگوریتم دایچسترا نوشته شده) ممنون میشم کمکم کنید.
بعید می دونم مشکللی باشه ولی باز از استاد بپرسید در مورد هزینه الگوریتم چیزی نمی تونم بگم باید ببینم و به پیاده سازی هم مربوط است
سلام یه سوال شما میتونید درباره ی این برنامه راهنمایی کنید؟؟؟با (وکتور میخواهم قسمت جستجو رو بروم)
برنامه ای بنویسید که اطلاعات دانشجویان را دریافت وذخیره وبازیابی وجستجو کند /
خوب اول یک کلاس درست می کنید برای دانشجو ها که اطلاعاتی مثل شماره دانشجویی و اسم و… در آن است، بعد یه ویکتور از جنس اون کلاس درست می کنی و بعد اطلاعاتتو با دستور پوش که در متن آمده در وکتور می ریزی برای جستجو هم از خانه صفر وکاور شروع می کنی به مقایسه تا خونه آخر که همان سایز منهای یک است. موبد باشید. 🙂
سلام/خیلی سایت خوبی بود /درباره جستجو در وکتور میخواستم بیشتر بدونم؟؟؟؟؟؟؟؟؟؟
سلام، می توانید به سایت
Cplusplus.com
برید و کتابخانه vector. با همه ی متد هاشو ببینید
با سلام و خسته نباشی
مطالب بسیار مفیدی بود
میتونید یک مرجع نمونه سوال در مورد مبحث چند ریختی ، وراثت ، کلاسها ،تابعهای بازگشتی، رشته ها و اشاره گرها با زبان c++ بهم معرفی کنید.
با تشکر
با سلام ، می تونید از تمرین ها و مثال های آخر فصل کتاب “چگونه با سی پلاس پلاس برنامه بنویسیم؟” اثر دیتل استفاده کنید.
سلام.پستتون خیلی به دردم خورد.ممنون.
یه سوال داشتم شما تا حالا با Qtکار کردید؟چند تا سوال می خواستم بپرسم.اگه خودتون کار نکردید،میتونید کسی رو بهم معرفی کنید که کار کرده باشه و ایمیلش رو بهم بدید تا چند تا سوال بپرسم.اگه میشه از طریق ایمیلم بهم خبر بدید.@};-
سلام من خودم کار نکردم ولی یک ایمیل برای شما فرستادم که حاوی ایمیل فردی است که بلد است.
سلام ; تشکر از مطالب خوبتان کمتر سایتی دیدم که به این تر و تمیزی پست بذاره حیف که تعداد محدودی پست در هفته می گذارید .