Learning ©➕➕
4.52K subscribers
81 photos
2 videos
38 files
182 links
ک
Download Telegram
#vector #pop_back
🔵 وکتور(vector)

🔹تابع pop_back
void pop_back();


این متد بدون هیچ شرطی آخرین عنصر موجود در وکتور رو حذف میکنه ، ولو یه عنصر باشه . همون طور که میبینید هیچ پارامتر یا مقدار بازگشتی هم ندارد
#include <iostream>

#include <vector>


int main ()

{

std::vector<int> myvector;

int sum (0);//sum=0

myvector.push_back (100);

myvector.push_back (200);

myvector.push_back (300);

while (!myvector.empty())

{

sum+=myvector.back();

myvector.pop_back();

}

std::cout<<"The elements of myvector add up to"<<sum<<'\n';

return 0;

}

Output :
The elements of myvector add up to 600
این برنامه سه تا داده رو به وکتور اضافه میکنه بعد با یه حلقه مقدار آخرین عنصر رو با یه متغییر جمع میزنه بعدم همون عنصر رو حذف میکنه تا موقعی که وکتور کاملا خالی بشه
🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
#vector #push_back
🔵 وکتور(vector)

🔹تابع push_back
void push_back (const value_type& val);

void push_back (value_type&& val);


تابع push_back یه عنصر به آخر وکتور اضافه میکند این عنصری که ما به آخر وکتور اضافه میکنیم هم میتونه مقدار یک متغییر باشد هم یک مقدار صریح که ما به متد میدیم. وقتی ما یه عنصر به آخر وکتور اضافه میکنیم پس قطعا طول اون هم بیشتر میشه و حتی ممکنه ظرفیت (capacity) وکتور هم بیشتر بشه
این متد خودش اتوماتیک میتونه حافظه ی مورد نیازه داده ی جدید رو تخصیص بده

پارامتر ها:
متغییر val: همون عنصری که باید به آخر وکتور اضافه بشه
#include <iostream>

#include <vector>


int main ()

{

std::vector<int> myvector;

int myint;

std::cout<<"Please enter some integers(enter 0 to end):\n";

do {

std::cin>>myint;

myvector.push_back (myint);

}

while (myint);

std::cout<<"myvector stores "<<int(myvector.size())<<" numbers.\n";

return 0;

}

در مثال بالا ما یک سری داده رو از کاربر میگریم و تا موقعی که اون داده 0 نیست داده ها رو به آخر وکتور اضافه میکنیم به همین سادگی.
🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
#vector #insert
🔵 وکتور(vector)

🔹تابع Insert(قسمت اول)
single:

element iterator insert (const_iterator position,const value_type& val);


fill:

iterator insert (const_iterator position,size_type n,const value_type& val);


range:

template <class InputIterator>

iterator insert (const_iterator position,InputIterator first,InputIterator last);


move:

iterator insert (const_iterator position,value_type&& val);


initializer list:

iterator insert (const_iterator position,initializer_list<value_type> il);


متد insert میتونه یه یا چند عنصر را داخل یک جای مختلف از وکتور اضافه بکند, مثلا میتواند 5 تا عنصر جدید بعد از دهمین عنصر داخل وکتور اضافه کند, تازه میتوانیم یک بازه ی جدید به یک جای خاص از وکتورمان اضافه کنیم و یک مقدار پیشفرض داخلشون کپی کنیم.
توجه کنید که ما با اضافه کردن یک یا چند داده هیچ فضایی را برای آنها دوباره از سیستم نمیگریم، چون قبلا یک بازه ای از حافظه رو برای وکتور از سیستم گرفتیم (برای اطلاعات بیشتر رجوع شود به capacity). فقط در صورتی دوباره فضا میگریم که ظرفیت موجود برای وکتور (capacity) کم باشد و داده ها داخلش جا نگیرند.

🔹مفهوم Single element:
با این اورلود میتونیم فقط یه عنصر جدید به موقعیت position وکتور اضافه کنیم

🔹مفهوم Fill:
با این اورلود میتوانیم یک بازه ی جدید به طول n از موقعیت position با مقدار پیش فرض val اضافه کنیم

🔹مفهوم Range:
با این میتوانیم یک دسته از عناصر جدید مثل یک آرایه یا یک وکتور دیگه را به موقعیت position اضافه کنیم

🔹مفهوم Move:
با این میتوانیم مقدار یک متغییر را اضافه کنیم

🔹مفهوم Initializer list:
با این میتوانیم یک دسته از داده هایی با نوع نا معلوم را به وکتور اضافه کرد

پارامتر ها :
🔹پارامتر Position:
موقعیتی از وکتور هست که می خواهیم داده های جدید به آن موقعیت اضافه شوند. دقت کنید که هیچ داده ای قبل از position قرار نمیگیرد و همه ی داده از position به بعد داخل وکتور قرار میگیرند

🔹پارامتر Val:
همان مقداری هست که می خواهیم به وکتور اضافه شود یا به عنوان مقدار پیشفرض تو بازه ی جدید جا بگیرد

🔹پارامتر n:
طول بازه ی جدیدی هست که ما می خواهیم به وکتورمان اضافه کنیم

🔹پارامتر First,last:
این دوتا میتوانند یا iterator هایی به اول و آخر یک وکتور دیگه باشند یا اشارگر هایی به اول و آخر یک آرایه. کل داده هایی که بین این دوتا اشارگر قرار میگیرند به وکتور اضافه میشوند

🔹پارامتر Li:
همان لیست با نوع نامعلوم هست

🔹مقادیر بازگشتی:
یک iterator به اولین عنصری که به وکتور اضافه شده. اگر یکی باشد به همان یکی اشاره میکند

1.#include <iostream>

2.#include <vector>


3.int main ()

4.{

5.std::vector<int> myvector(3,100);

6.std::vector<int>::iterator it;

7.it=myvector.begin();

8.it=myvector.insert(it,200);

9.myvector.insert(it,2,300);

10.//"it" no longer valid, get a new one:

11.it=myvector.begin();

12.std::vector<int> anothervector(2,400);

13.myvector.insert(it+2,anothervector.begin(),anothervector.end());

14.int myarray []={501,502,503};

15.myvector.insert(myvector.begin(),myarray,myarray+3);

16.std::cout<<"myvector contains:";

17.for(it=myvector.begin();it<myvector.end();it++)

18.std::cout<<' '<<*it;

19.std::cout<<'\n';

20.return 0;

21.}


22.Output:
23.myvector contains: 501 502 503 300 300 400 400 200 100 100 100


خط 5:
5.std::vector<int> myvector(3,100);
تعریف یک وکتور با طول 3 و مقدار پیشفرض 100, پس تا الان :
100 100 100

خط 8:
8.it=myvector.insert(it,200);
دادن یک iterator و مقدار 200 به متد. چون این iterator به اول وکتور اشاره میکند پس این مقدار به اول وکتور اضافه میشود, نتیجه :
200 100 100 100

خط 9:
9.myvector.insert(it,2,300);
دادن یک iterator ، یک طول و یک مقدار پیشفرض, دقت کنید که it هم اکنون به اول همان وکتور اولی اشاره میکند (یعنی اولین 100) چرا ؟ چون ما آن را مقدار دهی کردیم ولی بعد از اینکه محتویات وکتور را تغییر دادیم دوباره آن را مقدار دهی نکردیم, اما چون در خط 8 it را مساوی با مقدار بازگشتی متد insert گذاشتیم پس دوباره به اول همین وکتور اشاره میکند چرا ؟ چون متد insert یک اشاره گر به اولین داده ای که وارد وکتور میشود برمیگرداند که اینجا از قضا اولین داده ی وارد شده همان اولین داده ی داخل وکتورهست, پس :
300 300 200 100 100 100

خط 12:
12.std::vector<int> anothervector(2,400);
تعریف یک وکتور دیگر به طول 2 و مقدار 400

🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
#vector #insert
🔵 وکتور(vector)

🔹تابع Insert(ادامه قسمت اول)

خط 13:
13.myvector.insert(it+2,anothervector.begin(),anothervector.end());
دادن یک iterator که به دومین موقعیت وکتور اشاره میکند و دوتا iterator که به اول و آخر یک وکتور دیگر اشاره میکند, پس :
300 300 400 400 200 100 100 100
خط 14:
14.int myarray []={501,502,503};
تعریف یک آرایه و دادن مقادیری به آن

خط 15:
15.myvector.insert(myvector.begin(),myarray,myarray+3);
دادن یک iterator به اولین عنصر وکتور (متد begin() ) و دادن دو اشاره گر که یکی به اول و یکی به آخر آرایه اشاره میکند, در نتیجه:
501 502 503 300 300 400 200 100 100 100

🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
#vector #erase
🔵 وکتور(vector)

🔹تابع erase
iterator erase(const_iterator position);

iterator erase(const_iterator first,const_iterator last);


این تابع یک متد برای حذف کردن هست, برای حذف ما دو روش داریم یکی اینکه میتوانیم داده های داخله وکتور را حذف کنیم یا یک بازه از داده ها را ، مثلا از عنصر 4 تا 12 یا عنصر 4 تا آخر وکتور

پارامتر ها :
🔹مفهوم Position:
یک const_iterator به عنصری که میخواهیم حذف شود

🔹مفهوم First,last:
این ها دو const_iterator هستند که به اول و آخر آن بازه ای از داده ها که قراره از وکتور حذف شوند

🔹مقادیر بازگشتی:
یک iterator به اولین عنصر است که بعد از عنصری که حذف میشود, فرض کنید عنصر 4 حذف شده پس این متد یک اشاره گر به عنصر 5 به ما می دهد ولی چون عنصر 4 حذف شده پس عنصر 5 به جای 4 می آید پس در واقع یک اشاره گر به عنصر 4 به ما می دهد
1.#include <iostream>

2.#include <vector>


3.int main()

4.{

5.std::vector<int> myvector;

6.//set some values(from 1 to 10)

7.for(int i=1;i<=10;i++) 

8.myvector.push_back(i);

9.//erase the 6th element

10.myvector.erase(myvector.begin()+5);

11.//erase the first 3 elements:

12.myvector.erase(myvector.begin(),myvector.begin()+3);

13.std::cout<<"myvector contains:";

14.for(unsigned i=0;i<myvector.size();++i)

15.std::cout<<' '<<myvector[i];

16.std::cout<<'\n';

17.return 0;

18.}


Output:
myvector contains: 4 5 7 8 9 10

در این مثال یک وکتور تعریف شده و اعداد 1 تا 10 را داخل وکتور قرار می دهیم بعد 6مین عنصر را حذف میکنیم چون begin خودش به اولین عنصر اشاره میکند پس begin+1 به دومین عنصر اشاره میکند تا begin+5 به ششمین عنصر, سپس در خط 12, 3 عنصر اول وکتور را حذف میکند, دقت کنید که عنصر begin+3 حذف نمی شود

🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
#vector #capacity
🔵 وکتور(vector)

🔹تابع capacity
size_type capacity() const noexcept;

این متد که شاید یکی از هوشمندانه ترین تکتنیک های گرفتن حافظه است, البته این متد که هیچ حافظه ی تخصیص یا پس نمی دهد
ما اگر بخواهیم هر بار یک داده ی جدید را به وکتورمان اضافه کنیم باید یک بار یک تابع را برای گرفتن حافظه ی مورد نیازه آن داده فراخوانی کنیم که کلی زمان را از دست می دهیم پس می آییم برای یک بازه ی مشخص از عناصر یک جا حافظه میگریم البته این بازه دست ما نیست و خود کتابخانه مراحلش را انجام میدهد، ولی یک توضیح بهتون میدم ...
اول بازه ها رو بهتون میگم که چجوری هستش ...
0 1 2 4 8 16 32 64 128 ...
اگر ما هیچ داده ای داخل وکتور نداشته باشیم مقدار حافظه ای که وکتور از سیستم می گیرد 0 هست اگه یک داده داشته باشیم بازم 1 هست اگه 2 تا داده باشیم بازم 2 هست اگه 3 تا داده داشته باشیم مقدارش میشه 4. بزارین ساده تر بگم مثلا برای تعداده داده هایی بین 16 تا 32 ما میاییم 32 تا حافظه میگیریم حتی اگه تعداد داده هامون 20 تا باشه یا مثلا اگه تعداد داده هامون 50 تا باشه وکتور میاد 64 تا حافظه میگیرد
فایدشم اینه که ما مجبور نیسیتیم برای هر داده ای که وارد وکتور می کنیم یک بار یه تابع را برای گرفتن حافظه صدا بزنیم پس با این روش سرعتمون بیشتر می شود ...

🔹مقادیر بازگشتی:
بازه ای که برایش حافظه گرفته شده را برمیگرداند

#include <iostream>

#include <vector>

using namespace std;


int main()

{

vector<int> a;

cout<<a.capacity()<<endl;

a.push_back(1);

cout<<a.capacity()<<endl;

a.push_back(2);

cout<<a.capacity()<<endl;

a.push_back(3);

cout<<a.capacity()<<endl;

a.push_back(4);

a.push_back(5);

a.push_back(6);

cout<<a.capacity()<<endl;

a.push_back(7);

a.push_back(8);

a.push_back(9);

cout<<a.capacity()<<endl;

return 0;

}


Output:
0
1
2
4
8
16

مقدار حافظه ای که وکتور می گیرد یک مسیر تصاعدی دارد

🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
#vector #clear
🔵 وکتور(vector)

🔹تابع clear
void clear() noexcept;
این متد کل محتویات وکتور رو پاک میکند
ما میتوانیم با یک روش دیگر هم کل عناصر وکتور رو پاک کنیم
vector<T>().swap(x);
به جای T نوع وکتور و به جای x اسم وکتور را قرار می دهیم
#include <iostream>
#include <vector>

int main ()
{
std::vector<int> myvector;
myvector.push_back (100);
myvector.push_back (200);
myvector.push_back (300);
std::cout<<"myvector contains:";
for(unsigned i=0;i<myvector.size();i++)
std::cout<<' '<<myvector[i];
std::cout<<'\n';
myvector.clear();
myvector.push_back(1101);
myvector.push_back(2202);
std::cout<<"myvector contains:";
for(unsigned i=0;i<myvector.size();i++)
std::cout<<' '<<myvector[i];
std::cout<<'\n';
return 0;
}


Output:
myvector contains: 100 200 300
myvector contains: 1101 2202

🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
#vector #size
🔵 وکتور(vector)

🔹تابع size
size_type size() const;


تعداد عناصری که داخل وکتور ذخیره شده را برمیگرداند, تعداد عناصر هیچ ربطی به نوع یا اندازه ی عناصر ندارد

🔹مقادیر بازگشتی :
تعداد عناصر ذخیره شده داخل وکتور
#include <iostream>

#include <vector>

using namespace std;


int main ()

{

vector<int> myints;

cout<<"0.size: "<<myints.size()<<'\n';


for(int i=0;i<10;i++)

myints.push_back(i);

cout<<"1.size: "<<myints.size()<<'\n';


myints.insert(myints.end(),10,100);

cout<<"2.size: "<<myints.size()<<'\n';


myints.pop_back();

cout<<"3.size: "<<myints.size()<<'\n';


return 0;

}


Output:
size: 0
size: 10
size: 20
size: 19

🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
#vector #reserve
🔵 وکتور(vector)

🔹تابع reserve
void reserve (size_type n);

با این متد میتوانیم بازه ای از حافظه را که برای داده ها گرفته شده تغییر بدیم. برای اطلاعات بیشتر به capacity مراجعه شود. شما میتوانید این بازه را به هر اندازه ای که خواستید تغییر بدین حتی اگر این بازه جزء توان های 2 نباشد و در ضمن شما هیچ وقت نمیتوانید این بازه را بیشتر از max_size کنید و اگر تلاش کنید که همچین کاری انجام بدین این متد یک error را داخل کلاس length_error تنظیم میکند و صد البته نمیتوانید مقدار این بازه را از تعداد عناصر وکتور کمتر کنید و دو صد البته که نمیتوانید مقدار این بازه را از بازه ی فعلی هم کمتر کنید یعنی اگر مثلا تعداد عناصرمان 10 تا باشد، بازه ی حافظمان 16 تا می شود و ما نمیتوانیم این بازه را با تابع reserve از 16 تا کمتر کنیم
❌مفهوم length_error:
این کلاس نوعی از اشیا را که یک استثنا برای گزارش طول خطا پرتاب می کند تعریف می کند

🔹پارامتر ها :
🔻متغییر n
اندازه ی بازه ای که می خواهیم وکتور به آن تغییر اندازه دهد

#include <iostream>

#include <vector>

using namespace std;


int main()

{

vector<int> a;

for(int i=0;i<=10;i++)

a.push_back(i);

a.reserve(100);

cout<<a.capacity()<<endl;

return 0;

}


Output:
100
همان طور که میدانید بازه ی استاندارد برای این وکتور 16 هست ولی ما آن را به 100 تغییر دادیم

🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
#vector #resize
🔵 وکتور (vector)

🔹تابع resize
void resize (size_type n);
void resize (size_type n, const value_type& val);

این متد می تواند اندازه ی فعلی وکتور را عوض کند ما در تعریف وکتور با یک اورلود می توانستیم همزمان با تعریف وکتور اندازه ی آن را هم مشخص کنیم حالا با این تابع میتوانیم اندازه ی وکتور را عوض کنیم.
اگر اندازه ایی که می دهیم از اندازه ی فعلی خود وکتور کمتر باشد داده هایی که در قسمت آخر وکتور ذخیره شده اند را از بین می برد ولی اگه بیشتر باشد آن را با مقدار 0 پر می کند مگر اینکه مقدار val را به آن بدهیم, اگر val را مقدار دهی کنیم و n هم بزرگتر از اندازه ی فعلی خود وکتور باشد خانه های اضافی را با مقدار val پر می کند.

🔹پارامتر ها:
🔻متغییر n
این میزان اندازه ایی هست که قرار هست وکتور به این میزان تغییر اندازه دهد

🔻متغییر val
اگر n بزرگتر از اندازه ی فعلی خود وکتور باشد خانه های اضافی با این مقدار پر میشوند و اگر مقدار دهی نشوند خانه های اضافی با 0 پر می شوند

#include <iostream>
#include <vector>

int main ()
{
1.std::vector<int> myvector;

2.//set some initial content:
3.for(int i=1;i<10;i++)
4.myvector.push_back(i);

5.myvector.resize(5);
6.myvector.resize(8,100);
7.myvector.resize(12);

8.std::cout<<"myvector contains:";
9.for(int i=0;i<myvector.size();i++)
11.std::cout<<' '<<myvector[i];
12.std::cout<<'\n';

11.return 0;
12.}

Output:
myvector contains:1 2 3 4 5 100 100 100 0 0 0 0

با اجرای خط 3 اندازه ی وکتور 10 می شود چون ده تا عدد داخل وکتور ذخیره می کنیم با خط 4 اندازه وکتور به 5 تغییر پیدا میکند که 5 تا داده ی آخر از بین می روند. با خط 5 اندازه اش 8 می شود که 3 تای آخر با 100 مقدار دهی میشوند ،5 تای اول هم که خودشان مقدار دارند. با خط 6 اندازه اش 12 تا می شود که 4 تای آخر با 0 مقدار دهی می شوند، 8 تای اول هم که خودشان مقدار دارند

🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
#vector #max_size
🔵وکتور(vector)

🔹تابع max_size
size_type max_size( ) const;

این متد تعداد بیشترین عناصری را که می توانیم داخل وکتور ذخیره کنیم را به ما می دهد، می دانید که وکتور هم یک حافظه ای دارد که ممکن است با پر شدنش تمام شود، حال اگر قرار باشد تعداد بیشتری عنصر را داخل وکتور ذخیره کنید می توانید یک کلاس تعریف کنید و به گونه ای تنظیم شود که تا زمانی که اولی پر نشده هیچ عنصری داخل وکتور دوم نرود و به همین ترتیب برای دیگر وکتورها هم همینطور عمل کنید

🔹مقادیر بازگشتی :
بیشترین تعداد عناصری که می توانیم در وکتور ذخیره کنیم
#include <iostream>
#include <vector>
using namespace std;

int main( )
{
vector<int> a;
cout<<a.max_size( )<<endl;
return 0;
}


Output :
1073741823

مثال)
#include <iostream>
#include <vector>
using namespace std;

class vec
{
public:
vector<int> vec1;
vector<int> vec2;
void push_back(int data);
void print( );
};

int main( )
{
vec a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(4);
a.push_back(5);
a.push_back(6);
a.print( );
return 0;
}

void vec::push_back(int data)
{
if(this>vec1.size( )==this
>vec1.max_size( ))
this->vec2.push_back(data);
else
this->vec1.push_back(data);
}

void vec::print( )
{
for(int i=0;i<this->vec1.size( );i++)
cout«this->vec1.at(i)<<endl;
if(this->vec2.size( )!=0)
for(int j=0;j<this->vec2.size( );j++)
cout<<this->vec2.at(j)<<endl;
}

این هم برای ذخیره ی عناصر بیشتر از ظرفیت وکتور, اگر به تعداد بیشتری لازم دارید می توانید وکتورهای بیشتری داخل کلاس تعریف کنید و داخل انها هم داده ذخیره کنید
شعری هست که میگوید تا وکتور اول پر نشده است عناصر رو داخل وکتور اول ذخیره کن اگر اولی پر شد در دومی ذخیره کن اگر دومی پر شد در سومی ذخیره کن نشانه ی پر شدن وکتور هم این است که size( ) با max_size( ) برابر می شود

🔰ترجمه شده ازسایت www.cplusplus.com
@learncpp
#vector #at
🔵وکتور(vector)

🔹تابع at

reference at (size_type n);
const_reference at (size_type n) const;

این متد در عمل کاملا مثل عملگر [ ] عمل می کند با این تفاوت که اگر آن اندیسی که ما به این متد می دهیم نا معتبر باشد (برابر یا مساوی با size( ) یا کمتر از 0 به قول سایت سی پلاس یک استثناء پرتاب می کند که می توانیم با ساختار try،{ }catch( ){ } آن را چک کنیم

🔹پارامتر ها:

🔻مفهوم n:
اندیسی برای موقعیت عنصری که می خواهیم به آن دسترسی پیدا کنیم

#include <iostream>

#include <vector>

using namespace std;


int main ( )

{

vector<int> myvector (10);

//10 zero-initialized ints//assign some values:

for (unsigned i=0;i<myvector.size( );i++)

myvector.at(i)=i;

cout<<"myvectorcontains:";

for (unsigned i=0;i<myvector.size( );i++)

cout<<' '<<myvector.at(i);

cout<<'\n';

return 0;

}


Output:
myvector contains: 0 1 2 3 4 5 6 7 8 9

مثال)

#include <iostream>

#include <vector>

#include <stdexcept>

using namespace std;


int main( )

{

vector<int> a;

for(int i=0;i<=10;i++)

a.push_back(i);

try

{

 cout<<a.at(-10)<<endl;

 }

catch(const out_of_range& o)

{

cout<<o.what( )<<endl;

 }

return 0;

}


Output:
Vector::_M_range_check

اگر اندیسی که می دهیم خارج از محدوده باشد اینگونه می شود ...

🔰ترجمه شده از سایت www.cplusplus.com
@learncpp
#vector #operator
🔵وکتور(vector)

🔹تابع Operator[ ]
reference operator[ ] (size_type n);
const_reference operator[ ] (size_type n) const;

عملگر [ ] مثل اندیس داخل آرایه ها عمل می کند و همین عملگر باعث شباهت وکتور و آرایه هاست. ما به دو روش می توانیم از اندیس برای دسترسی به عناصر وکتور استفاده کنیم اولی که همان روش معمولی آرایه هاست :
Vec[4]
و روش دیگر هم استفاده از متد operator[ ]( ) است :
Vec.operator[ ](4)
این دو روش هیچ تفاوتی ندارند.
عملکرد این عملگر با متد at کاملا مشابه است ولی اگر ما یک مقداری که در محدوده ی وکتور نیست (مثلا منفی است، سه یا یک مقداری بیشتر از تعداد عناصر داخل وکتور ) به متد at بدهیم این متد یک خطای out_of_range را ست می کند ولی عملگر [ ] مقدار 0 را به ما می دهد.

🔹پارامتر ها:

🔻مفهوم N:
موقعیت یا اندیس عنصر داخل وکتور که البته از 0 شروع می شود نه از 1

#include <iostream>

#include <vector>

using namespace std;


int main( )

{

vector<int>a;

for(int i=0;i<=10;i++)

a.push_back(i);

for(int j=0;j<=10;j++)

cout<<a[j]<<"\t";

cout<<endl;

a[2]=34;

cout<<a[2]<<endl;

return 0;

}


Output:
0 1 2 3 4 5 6 7 8 9 10
34
همان طور که می بینید با این عملگر می توانیم هم مقداری را بخوانیم هم مقداری را تغییر بدهیم، کاملا شبیه آرایه ها.

🔰ترجمه شده ازسایت www.cplusplus.com
@learncpp
#vector #Empty
🔵وکتور(vector)

🔹تابع Empty
bool empty( ) const noexcept
به طور کاملا ساده ای چک می کند که آیا وکتور ما خالی است یا نه، خالی بودن به این معنی است که size( ) مقدارش 0 باشد.

🔹مقادیر بازگشتی :
اگر true باشد وکتور ما خالی است در غیر اینصورت اگر false باشد یعنی حداقل یک عنصر داخل وکتور وجود دارد
مثال)

#include <iostream>
#include <vector>
using namespace std;

int main ( )
{
vector<int> myvector;
int sum (0);
for (int i=1;i<=10;i++) myvector.push_back(i);
while(!myvector.empty( ))
{
sum += myvector.back( );
myvector.pop_back( );
}
cout<<"total: "<<sum<<'\n';
return 0;
}

Output :
Total: 55

این برنامه یک وکتور را با یک دنباله از اعداد 1 تا 10 پر می کند بعد تا زمانی که خالی نشده یکی از آخر حذف می کند و یه متغیر را ++ می کند. وقتی که وکتور خالی شد از حلقه بیرون می آید و مقدار آن متغیر که حالا برابر با تعداد عناصر داخل وکتور است را چاپ میکند.

🔰ترجمه شده از سایت www.cplusplus.com
@learncpp
#vector #iterator
🔵وکتور(vector)

🔹مفهومiterator:
شاید برای شما سوال پیش آمده باشد که چگونه می شود یک اشاره گر را طوری تعریف کرد که بتواند به جای خاص از یک وکتور اشاره کند اگر ما یک وکتور را به روش معمولی به صورت اشاره گر تعریف کنیم آن اشاره گر فقط می تواند به ابتدای وکتور اشاره کند ولی اگر به روش زیر عمل کنید می توانید به ابتدا و انتهای یک وکتور اشاره کنید :

Vector<int>::iterator a;
حال a به صورت یک اشاره گر از نوع وکتور تعریف شده حال چگونه باید به انتهای وکتور اشاره کند؟ یک متد داخل وکتور هست که می تواند این کار را انجام دهد

a.end( );
حالا a به انتهای وکتور اشاره می کند.

a.begin( );
حالا a به ابتدای وکتور اشاره می کند.

🔰ترجمه شده از سایت
www.cplusplus.com

@Learncpp
#vector #Begin
🔵وکتور(vector)

🔹تابع Begin
iterator begin( ) noexcept;
const_iterator begin( ) const noexcept;

و اما begin ... این یک اشاره گر بر می گرداند که به اولین عنصر وکتور اشاره میکند البته می دانید که منظورم از اشاره گر همان iterator است . begin و end مثل هم عمل می کنند با این تفاوت که begin به اول وکتور اشاره می کند و end به آخر وکتور البته همیشه آخرینه آخرین عنصری که برای ما هم بدون iterator ها قابل دسترسی نیست مقدار 0 یا همان NULL است که end به همین اشاره می کند بروید end را بخوانید

🔹مقادیر بازگشتی :
اگر داده ای داخل وکتور وجود داشته باشد یک اشاره گر به اولین داده داخل وکتور برمی گرداند اگر داده ای هم نباشد begin به چیزی اشاره نمیکند پس begin چیزی را برنمی گرداند.

#include <iostream>
#include <vector>
using namespace std;

void main( )
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
cout<<*vec.begin( )<<endl;
vector<int>::iterator s=vec.begin( );
cout<<*s<<endl;
}


Output :
1
1

در این مثال می بینید که با iterator ها می شود مثل اشاره گر ها رفتار کرد یعنی با عملگر * می توانیم مقدار آنها را بخوانیم در این مثال دو نوع استفاده از iterator ها گفته شده است یک بار اولین عنصر وکتور را مستقیم با عملگر * می خوانیم و چاپ می کنیم یک بار هم iterator ی که به اولین عنصر اشاره می کند را می ریزیم در یک iterator دیگر بعد با * چاپش می کنیم

🔰ترجمه شده ازسایت
www.cplusplus.com

@Learncpp
#vector #cbegin
🔵وکتور(vector)

🔹تابع cbegin
const_iterator cbegin( ) const noexcept;


یک const_iterator به اولین عنصر وکتور بر می گرداند، تفاوتش با begin این است که شما با begin می توانید مقدار اولین عنصر وکتور را عوض کنید مثل این :

*Vec.begin( ) = 12;

ولی با cbegin نمی توانید این کار را کنید و برای زمانهایی خوب است که شما می خواهید فقط به اولین عنصر وکتور دسترسی داشته باشید و مطمئن هم باشید که هیچ موقع مقدار تغییر نمی کند چون اگر از begin استفاده کنید ممکن است جایی از برنامه به طور کاملا ناخواسته و اشتباها مقدارش عوض شود.

🔹مقادیر بازگشتی :
یک const_iterator به اولین عنصر وکتور اشاره می کند و اگر وکتور خالی باشد به چیزی اشاره نمی کند.

#include <iostream>
#include <vector>
using namespace std;

int main ( )
{
vector<int> myvector={10,20,30,40,50};
cout<< myvector contains:";
for(auto it=myvector.cbegin( );it != myvector.cend( );++it)
cout<< ' '<<*it;
cout<< '\n';
return 0;
}

Output:
myvector contains: 10 20 30 40 50

همانطور که می بینید با cbegin می توانیم مطمئن باشیم که به اولین عنصر به طور فقط_خواندنی دسترسی داریم.

🔰ترجمه شده ازسایت
www.cplucpluc.com

@Learncpp
#vector #Rbegin
🔵وکتور(vector)

🔹تابع Rbegin
reverse_iterator rbegin( ) noexcept;
const_reverse_iterator rbegin( ) const noexcept;

تابع rbegin می تواند جایگزین مناسبی برای end باشد. rbegin همه چیز را داخل وکتور برعکس می بیند حتی ترتیب عناصر، پس با این حساب اولین عنصر را هم آخرین عنصر می بیند پس یک اشاره گر به آخرین عنصر وکتور برمی گرداند. دقت کنیم که یک اشاره گر به آخرین عنصر بر می گرداند نه به آخرینه آخرین عنصر پس می توانیم جای تابع end از آن استفاده کنیم و دیگر مجبور نباشیم آخرین عنصر را با * یا end بخوانیم.

🔹مقادیر بازگشتی :
یک reverse_iterator به آخرین عنصر وکتور بر می‌گرداند

#include <iostream>
#include <vector>
using namespace std;

int main( )
{
vector<int> c;
c.push_back(1);
c.push_back(2);
c.push_back(3);
cout<<*c.rbegin( )<<endl;
return 0;
}

Output :
3

برعکس اسمی که دارد عمل می کند.

🔰ترجمه شده از سایت
www.cplusplus.com

@Learncpp
#vector #crbegin
🔵وکتور(vector)

🔹تابع Crbegin
const_reverse_iterator crbegin( ) const noexcept;
این تابع یک const_reverse_iterator را بر می گرداند در واقع این متد کل وکتور را برعکس می بیند و بجای اینکه یک iterator به اولین عنصر برگرداند یک iterator به آخرین عنصر بر می گرداند البته این iterator به ما دسترسی فقط_خواندنی می دهد و نمی توانیم مقدار عنصر را عوض کنیم.

🔹مقادیر بازگشتی :
یک const_renerse_iterator به اولین عنصر وکتور

#include <iostream>
#include <vector>
using namespace std;

int main ( )
{
vector<int> myvector={1,2,3,4,5};
cout<<"myvector backwards:";
for(auto rit=myvector.crbegin( );rit != myvector.crend( );++rit)
cout<<' '<<*rit;
cout<< '\n';
return 0;
}


Output:
myvector backwards: 5 4 3 2 1

🔰ترجمه شده از سایت
www.cplusplus.com

@Learncpp
#vector #End
🔵وکتور(vector)

🔹تابع End

iterator end( )noexcept;
const_iterator end( )const noexcept;

این هم یک iterato بر می گرداند که به آخرینه آخرین عنصر داخل وکتور اشاره می کند یا به قول خود سایت سی پلاس past-the-end element، البته اگر بخواهید مقدار این اشاره گر را با * بگیرید باید گفت چیزی بیشتر از یک 0 نصیبتان نمی شود فرض کنید مقادیر 0 و1 و2 و 3 را داخل وکتور push_back کردیم به نظر شما، حال وکتور ما چه وضعیتی دارد؟

0 1 2 3 0

این 0 آخر از کجا آمد؟؟؟ این در واقع همان NULL ی است که انتهای وکتور را مشخص می کند مثل زمانی که می خواستیم آخر لینک لیست را با NULL مشخص کنیم.

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main( )
{
vector<int> c;
c.push_back(1);
c.push_back(2);
c.push_back(3);
cout<<*c.end( )<<”\t”;
cout<<*--c.end( )<<endl;
return 0;
}


Output :
0 3

همان طور که در مثال می بینید با اولین cout فقط یک 0 چاپ شده چون ما داریم به آن می گوییم که آخرینه آخرین عنصر وکتور را چاپ کند ولی با cout دوم مقدار 3 چاپ می شود چون ما به آن گفتیم آخرین عنصر وکتور را چاپ کن.

🔰ترجمه شده از سایت
www.cplusplus.com

@Learncpp