وکتور vector یکی از کلاس های خیلی خوبه سی پلاس پلاس است که استفاده از آن نوشتن خیلی از برنامه ها رو آسان می کند . وکتور تا حدودی مانند آرایه است با این تفاوت که می شود حین برنامه به آن اضافه کرد و یا کم کرد هم چنین متد های زیادی دارد که باعث می شود وقتمان را برای نوشتن متد برای کار با آریه هدر ندهیم .
البته بجای لینک لیست در خیلی از جاها می شود وکتور هم استفاده کرد و از درد سرهای لینک لیست کاست برای دیدن آموزش لینک لیست اینجا کلیک کنید.
برای استفاده از وکتور باید هدر آن را پیوست برنامه کرد :
#include <vector>
فرض کنید می خواهیم وکتوری به اسم test شامل ۱۰ خانه از نوع int تعریف کنیم که مقدار اولیه همه خانه ها ۰ است:
vector <int> test(10,0);
test[5];
2-با استفاده از تابع عضو at() :
test.at(5);
استفاده از at بهتر است چون اگر از وکتور بیرون بزنیم برنامه خطا می دهد ولی در حالت یک چنین اتفاقی نمی افتد.
در بالا از سایز اسم بردم پس بگذارید شما را با دو اصطلاح آشنا کنم :
سایز (size) : سایز همان تعداد خانه هایی است که ما در وکتور داریم در وکتوری که ما ایجاد کردیم سایز ۱۰ است و برای پیدا کردن سایز وکتور تابع عضو size را داریم که به این شکل است :
test.size();
حالا اگه آن را در دستور خروجی قرار بدهیم مقدار ۱۰ را نشان می دهد:
cout<<test.size();
–ظرفیت (capacity):فرض کنید که ما بخواهیم یک خانه به وکتور اضافه کنیم و این کار را چند بار انجام دهیم کمی وقت می گیرد تا از حافظه بخشی را برای آن جدا کند به همین خاطر این در وکتور تعدادی خانه را آماده نگه می دارد برای وقتی که خواستیم به طول آن اضافه کنیم برای پی بردن به ظرفیت از تابع عضو capacity() استفاده می کنیم:
test.capacity();
اگر آن را در خروجی چاپ کنیم مقدار ۱۲ را بر می گرداند که دوتا از سایز بزرگ تر است یک سوال پیش می آید با خود می گوییم اگر ۲ خانه به وکتور اضافه کردیم و ظرفیت پر شد چه می شود؟ جواب ساده است آنگاه برنامه دوباره ظرفیت را زیاد می کند.
حالا نوبتی هم باشه نوبت max_size() این تابع عضو بیشرین طول ممکن برای ایجاد یک وکتور را می گوید که اندازه آن به مشخصات سیستم مربوط می شود:
test.max_size();
حالا می ریم سراغ تابع عضو resize() که یکی از تابع های کاربردی در وکتور است فرض کنید در وکتور test با سایز ۱۰ ما ۴ خانه آخر را نخواهیم یا ۴ خانه کم داشته باشیم و بخواهیم اضافه کنیم :
test.resize(6); test.resize(14);
در دستور اول سایز را به ۶ کاهش دادیم و در دستور بعدی سایز را ۱۴ تا اضافه کردیم.
دو تابع عضو دیگر هم به اسم .push_back() و pop_back() را هم داریم که کار اضافه کردن و کم کردن به آخر وکتور را دارند:
۱-تابع عضو push_back:
test.push_back(8);
با دستور بالا یک خانه به آخر وکتور با مقدار ۸ اضافه می شود و به سایز وکتور یکی اضافه می شود.
۲-تابه عضو .pop_back() :
test.pop_back();
با این دستور خانه آخر وکتور از بین می رود و از سایز وکتور یکی کم می شود.
تابع های عضو .back() و .front() هم خانه های آخر و اول وکتور را تعیین می کنند:
test.front(); test.at(0);
دو دستور بالا با هم برابرند.
برای نابود کردن یک وکتور هم از تابع عضو .clear() استفاده می کنیم:
test.clear();
در زیر هم کدی از چیز هایی که گفته شد آمده – مثالی از وکتور vector در سی پلاس پلاس:
#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; } //decrise .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; }