Learning ©
5.63K subscribers
81 photos
2 videos
38 files
182 links
کانال تخصصی آموزش برنامه نویسی ©
🎨فهرست مطالب
t.me/Learncpp/2318
💳 تعرفه پین شده تبلیغات👇
@Cancerchilds
💠آموزش شبکه
@amouzesh_shabake
🌐اینستاگرام
instagram.com/learncplusplus
Ceeport
Contact: @QtCplusplus @codingpluss

💞 @RadioInformation 💞
Download Telegram
#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
#vector #cend
🔵وکتور(vector)

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

به آخرینconst_iterator یک cend عنصر وکتور بر می گرداند. شما با این تابع می توانید مطمئن باشید که به آخرینه آخرین عنصر دسترسی فقط_خواندنی دارید وطبق هیچ شرایطی نمی توانید مقدارش راعوض کنید.

🔹مقادیر بازگشتی :
یک 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

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

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

🔹تابع Rend
reverse_iterator rend( ) noexcept;

const_reverse_iterator rend( ) const noexcept;


تابع rend یک iterator به اولینه اولین عنصر داخل وکتور برمی گرداند. وقتی که end به آخرینه آخرین عنصر وکتور که یک 0 هست اشاره می کند پس rend هم به اولینه اولین عنصر که مقدارش یک مقدار فرضی داخل حافظه است و اصلا ربطی به برنامه ی ما ندارد اشاره می کند که اگر می خواهید به اولین عنصر با این متد دسترسی داشته باشید باید آن اشاره گر را یک بار – کنید.

🔹مقادیر بازگشتی :
یک 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.rend( )<<endl;

cout<<*--c.rend( )<<endl;

return 0;

}


Output :
436700230
1
نیازی به توضیح ندارد، فقط آن مقدار بی ربطی که چاپ می شود ممکن است در کامپیوتر شما متفاوت باشد.

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

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

🔹تابع Back
reference back( );
const_reference back( ) const;


این متد مقدار آخرین عنصر وکتور را به ما می دهد تفاوتش با تابع end( ) این است که end( ) یک iterator به آخرین عنصر به ما می دهد ولی back( ) خود عنصر را به مامی دهد.

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

int main ( )
{
vector<int> myvector;
myvector.push_back(10);
while(myvector.back( ) != 0)
{
myvector.push_back
(myvector.back( ) -1 );
}
cout<<"myvector contains:";
contains:";
for(unsigned i=0;i<myvector.size( ) ;i++)
cout<<' '<<myvector[i];
cout<<'\n';
return 0;
}


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

این برنامه هم با یک الگوریتم خیلی ساده مقادیر 10 تا 0 در یک وکتور می ریزد بعد هم آنها راچاپ میکند. اگر برنامه را ذهنی تریسم کنید به همین خروجی می رسید.

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

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

🔹تابع Emplace
template <class... Args>

iterator emplace (const_iterator position, Args&&... args);


یک داده ی جدید را به موقعیت position می برد. فرض کنید می خواهیم یک عنصر را به موقعیت 3 ببریم با این تابع این کار را می کنیم ولی عنصر قبل از موقعیت 3 از بین نمی رود بلکه به موقعیت 4 منتقل می شود و 4 به 5 و 5 به 6 تا آخر.

🔹پارامترها :

🔻مفهوم Position :
یک اشاره گر به موقعیتی که می خواهیم داده را اضافه کنیم

🔻مفهومArgs :
داده ای که قرار است اضافه شود

#include <iostream>

#include <vector>

using namespace std;


int main ( )

{

vector<int> a(3,100);

a.emplace(a.begin( )+1,12);

a.emplace(a.end( ),11);

for(auto& x: a)

cout<<x<<endl;

return 0;

}


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

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

🔹تابع Emplace_back
template <class... Args>

void emplace_back (Args&&... args);


یک داده را به آخر وکتور اضافه می کند.

🔹پارامتر ها :

🔻مفهوم Args :
داده ای باید به آخر وکتور اضافه شود

#include <iostream>

#include <vector>

using namespace std;


int main ( )

{

vector<int> myvector={10,20,30};

myvector.emplace_back(100);

myvector.emplace_back(200);

cout<<"myvector contains:";

for(auto& x: myvector)

cout<<' '<<x;

cout<<'\n';

return 0;

}


Output:
myvector contains: 10 20 30 100 200

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

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

🔹تابع = operator
🔹copy (1)

vector& operator= (const vector& x);


🔹move (2)

vector& operator=(vector&& x);


🔹initializer list (3)

vector& operator=(initializer_list<value_type> il);


چرا سی پلاس باید عملگر + رو برای وکتور آورلود کند؟ دلیل آن این است که ما وقتی می خواهیم از عملگر + برای انتصاب وکتور ها استفاده کنیم باید چیزی بیشتر از یک متغیر کپی شود در واقع ما می خواهیم یک کلاس را در یک کلاس دیگر کپی کنیم ولی نه هر گونه کپی کردنی باید آن کپی طوری باشد که می خواهیم

🔹عملگر + سه آورلود دارد

🔻1)مفهوم Copy :
این متد کل محتویات یک وکتور را کپی می کند در یک وکتور دیگر یعنی در واقع کل محتویات وکتور x را کپی می کند در یک وکتور جدید

🔻2)مفهوم Move :
این متد کل محتویات یک وکتور را منتقل می کند به یک وکتور دیگر

🔻3)مفهوم Initializer list :
این هم یک نوع داده ای که مشخص نیست را می ریزد در یک وکتور

🔹پارامتر ها :

🔻مفهوم X :
همان وکتوری که قرار است کپی یا منتقل شود

🔻مفهوم Li :
این هم همان لیستی است که نوع آن مشخص نیست
#include <iostream>

#include <vector>

using namespace std;


int main ( )

{

vector<int> foo(3,0);

vector<int> bar(5,0);


bar=foo;

foo=vector<int>();


cout<<"Size of foo: "<<int(foo.size( ))<<'\n';

cout<<"Size of bar"<<int(bar.size( )) <<'\n';

return 0;

}


Output:
Size of foo: 0
Size of bar: 3

متد size( ) تعداد عناصر داخل وکتور را بر می گرداند

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

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

🔹تابع Crend
const_reverse_iterator crend( ) const noexcept;


تابع crend یک const_reverse_iterator بر می گرداند که به ما یک دسترسی فقط_خواندنی به آخرینه آخرین عنصر وکتور می دهد و می توانیم مطمئن باشیم که تحت هیچ شرایطی مقدار آخرینه آخرین عنصر تغییر پیدا نمی کند.

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

#include <vector>

using namespace std;


int main( )

{

vector<int> a;

a.push_back(1);

a.push_back(2);

a.push_back(3);    

vector<int>::const_reverse_iterator r=a.crend( );

cout<<*r<<endl;

return 0;

}


Output :
235485120

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

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

🔹تابع Front
reference front( );

const_reference front( ) const;


این متد یک دسترسی کامل خواندنی-نوشتنی به اولین عنصر وکتور ما می دهد. دقت کنید که این متد با begin( ) فرق دارد. چون begin( ) یک iterator به اولین عنصر به ما می دهد ولی front( ) یک خود عنصر رو در دسترس ما می گذارد. اگر هیچ داده ای داخل وکتور نباشد
و ما این متد رو صدا بزنیم برنامه یک رفتار غیر قابل پیش بینی انجام می دهد که باعث می شود از طرف سیستم عامل به ما خطا بدهد.

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

#include <vector>

using namespace std;


int main ( )

{

vector<int> myvector;

myvector.push_back(78);

myvector.push_back(16);

myvector.front( ) -= myvector.back( );

cout<<"myvector.front( ) is now "<<myvector.front( )<< '\n';

return 0;

}


Output:
myvector.front( ) is now 62

می بینید که با این متد می توانیم هر کاری با اولین عنصر انجام بدهیم. به زبان ساده تر ما می توانیم با آن شبیه یک متغیر معمولی رفتار کنیم.

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

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

🔹تابع swap
template <class T, class Alloc>

void swap (vector<T,Alloc>& x, vector<T,Alloc>& y);


این متد مقادیر دو وکتور را با هم جابه جا می کند. یعنی داده های داخل x رو داخل y می برد و دادهای y رو در x ولی ...
این متد هیچ کپی یا جابه جا شدنی انجام نمی دهد. یعنی مقادیر داخل x رو کپی در y نمی کند. در عوض تمام اشاره گر های x رو به y می دهد و اشاره گر های y رو به x . منظور از اشارگر همان اشاره گر هایی هستند که به داده ها اشاره می کنند. ولی همه ی اشاره گر ها رو جا به جا نمی کند بلکه آن اشارگری که به اول x اشاره می کند را به y می دهد و برعکس .

فایده این کار چیست؟
تفاوت این دو در سرعت آنهاست که اصلا با هم قابل قیاس نیستند چون در این متد هیچ کپی انجام نمی شود پس سرعتش بالاست.

🔹پارامتر ها :

🔻مفهوم x,y :
دو وکتور که باید جا به جا شوند.

مثال)
#include <iostream>

#include <vector>

using namespace std;


int main ( )

{

unsigned int i;

vector<int> foo(3,100);

//three ints with a value of 100


vector<int> bar(5,200);

//five ints with a value of 200


foo.swap(bar);

cout<<"foo contains : ";

for(vector<int>iterator it=foo.begin( );it!=foo.end( );++it)

cout<<' '<<*it;

cout<<'\n';

cout<<"bar contains:";

for(vector<int>iterator it=bar.begin( );it!=bar.end( );++it)

cout<<' '<<*it;

cout<<'\n';

return 0;

}


Output:
foo contains: 200 200 200 200 200
bar contains: 100 100 100

⚠️یک تابع swap دیگر داریم که در پست (t.me/Learncpp/617) توضیح داده شده است

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

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

🔹تابع swap
void swap (vector& x);


با این تابع عضو کلاس وکتور می توانیم محتویات دو وکتور که هم نوع هستند(یعنی داده هایی با یک نوع را نگهداری می کنند) را با هم عوض کنیم .

🔹پارامتر ها:

🔻مفهوم X :
یک آبجکت از کلاس وکتور که می خواهیم محتویاتش با آبجکت فراخوان عوض شود.

مثال)
#include <iostream>

#include <vector>

using namespace std;


int main( )

{

vector<int> foo(3,100);

//three ints with a value of 100


vector<int> bar(5,200);

//five ints with a value of 200


foo.swap(bar);

cout<<"foo contains : ";

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

cout<<' '<<foo[i];

cout<<'\n';

cout<<"bar contains:";

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

cout<<' '<<bar[i];

cout<<'\n';

return 0;

}


Output :
foo contains: 200 200 200 200 200
bar contains: 100 100 100

⚠️یک تابع swap دیگر داریم که در پست (t.me/Learncpp/616) توضیح داده شده است

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

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

🔹تابع data
value_type* data( ) noexcept;


const value_type* data( ) const noexcept;


متد data یک اشاره گر به اولین عنصر وکتور به ما می دهد، دقت کنید یک اشاره گر نه یک iterator. ما با استفاده از همین اشاره گر می توانیم به بقیه ی عناصر هم دسترسی داشته باشیم. چگونه؟ با آفست عنصری, که ما می خواهیم به آن دسترسی داشته باشیم . حال آفست چیست؟ آفست به طور کلی به آدرس یک داده درحافظه نسبت به یک آدرس دیگر گویند. شما می دانید که ما هر آدرسی به کامپیوتر می دهیم نسبت به صفرمین خانه ی حافظه سنجیده می شود اما آفست می تواند نسبت به هر جایی از حافظه در نظر گرفته شود.
اگر براتون مبهم است به توضیحات زیر دقت کنید :

0.100
1.101
2.102
3.103
4.104
5.105
6.106
7.107
8.108
9.109
10.110

فرض کنید این 10 خانه ی اول حافظه است ما یک اشاره گر داریم به اسم p که به سومین سلول حافظه اشاره می کند فرض کنیم که نوع اشاره گر p از نوع char است، پس تمام آدرس هایی که با آفستی نسبت به p پیدا می شوند هم باید نوع char باشند. پس آفست سلول 6 نسبت به p می شود 3، چرا؟ چون سلول 6، 3 سلول از نوع char با سلول 3 فاصله دارد به عبارت ساده تر، برای پیدا کردن آفست یه سلول نسبت به یک سلول دیگر باید بیاییم حساب کنیم که چند سلول بین آنها فاصله است البته باید سلول ها را نسبت به نوع سلول مرجع بشماریم، مثلا اگر سلول مرجع به یک متغیر از نوع char اشاره می کند باید سلول ها را یکی یکی بشماریم، اگر سلول مرجع به یک متغیر از نوع int اشاره می کند باید سلول ها را 4 تا 4 تا بشماریم و برای بقیه ی نوع ها هم همین طور.
حالا در این مثالی که بالا زده شد اگر سلول 0 به یک متغیر از نوع int اشاره کند آفست سلول 8 نسبت به سلول 0 می شود 1. چرا؟چون بین 4 بایت اول تا 4 بایت سوم که اولین بایت است؛ بایت 8 می شود فقط یک 4 بایت وجود دارد حال متد data آدرس اولین خانه ی وکتور را به ما می دهد و ما نسبت به آن آدرس می توانیم به بقیه عناصر دسترسی داشته باشیم.

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

#include <vector>

using namespace std;


int main( )

{

vector<int> a;

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

a.push_back(i);

int *p=a.data( );

cout<<p<<"="<<*p<<endl;

cout<<p+1<<"="<<p[1]<<endl;

cout<<p+2<<"="<<p[2]<<endl;

cout<<p+3<<"="<<p[3]«endl;

cout<<p+4<<"="<<p[4]<<endl;

cout<<p+5<<"="<<*p+5<<endl;

return 0;

}


Output:
0x512c90=0
0x512c94=1
0x512c98=2
0x512c9c=3
0x512ca0=4
0x512ca4=5

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

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

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

🔹تابع shrink_to_fit
void shrink_to_fit( );


کار این تابع که تقریبا بهینه سازی حافظه ی وکتور است می دانیم که برای هر بازه ای از تعداد داده ها در یک بازه ی خاص, حافظه گرفته می شود (به تابع capacity مراجعه شود) حال اگر با استفاده از تابع reserve برای کار مهمی یک مقدار خیلی بزرگ بگیریم، می توانیم بعد از این که کار تمام شد کل وکتور را بهینه سازی کنیم تا حافظه هایی را که نیاز ندارد به سیستم برگردانده شود فرض کنید ما 10 تا داده داخل وکتور داریم ولی وکتورمان به اندازه ی 100 تا عنصر حافظه گرفته است با این متد می توانیم تعداد حافظه ها رو به 11 تا کاهش دهیم.

#include <iostream>

#include <vector>

using namespace std;


int main ( )

{

vector<int> a;

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

a.push_back(i);

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

a.shrink_to_fit( );

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

return 0;

}


Output:
128
101

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

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

🔹سازنده vector::vector
🔹default (1)
vector( );

explicit vector(cons tallocator_type& alloc);


🔹fill (2)
explicit vector(size_type n,const allocator_type& alloc=allocator_type( )); 

vector(size_type n,const value_type& val,const allocator_type& alloc=allocator_type( ));


🔹range (3)
template <class InputIterator>

vector (InputIterator first,InputIterator last,const allocator_type& alloc=allocator_type( ));


🔹copy (4)
vector(const vector& x);

vector(const vector& x,const allocator_type& alloc);


🔹move (5)
vector(vector&& x);

vector(vector&& x,const allocator_type& alloc);


🔹initializer list (6)
vector(initializer_list<value_type> il,

const allocator_type& alloc=allocator_type( ));


سازنده ی کلاس وکتور چندین آورلود دارد که هر کدام برای یک سطح برنامه نویسی هست که شکل کلی اینها در بالا هست.

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

🔹پارامتر ها

🔻مفهوم Default :
یک وکتور کاملا ساده و خالی درست می کند.

🔻مفهوم Fill :
با این آور لود می توانیم تعداد عناصری که قرار است داخل وکتورمان ذخیره کنیم را مشخص کنیم . با آورلود دومی هم می توانیم تمام خانه های وکتور را با یک مقدار پر کنیم. مثلا پنج خانه که همه آنها با 100 پر می شود.

🔻مفهوم Range :
با این می توانید یک وکتور دیگر را در وکتوری که می خواهیم بسازیم بریزیم. اما باید آدرس شروع و آدرس آخر وکتور را به وکتور جدید بدهیم . این عمل مثل این است که بگوییم این وکتور جدیدی که می خواهیم بسازیم اولش با وکتور مثلا x و آخرش هم با وکتور x برابر باشد که به طبع این وکتور جدید با وکتور قبلی برابر می شود البته این به این معنی نیست که ما فقط می توانیم از یک وکتور استفاده کنیم. با این اورلود می توانیم آدرس اول و آخر یک آرایه را که نوعش با نوع وکتور برابر است را به وکتور هم بدهیم یعنی بگوییم اول وکتور ما برابر با آدرس شروع آرایه ی x باشد و آخرش هم برابر با آخر آرایه ی x. پس خاصیت این آورلود این است که می توانیم یک آرایه را به وکتورمان منتقل کنیم.

🔻مفهوم Copy :
این آورلود کار همان آورلود قبلی را می دهد با این تفاوت که فقط کافی است اسم وکتور قبلی را به آن بدهیم مثلا می گوییم وکتور x برابر وکتور y شود .

🔻مفهوم initializer list :
با این می توانیم یک نوع داده ای را که نوعش برای ما مشخص نیست را در وکتور بریزیم.

آموزش بعدی سازنده وکتور(t.me/Learncpp/633)

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

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

🔹سازنده vector::vector
🔸آموزش قبلی سازنده وکتور(t.me/Learncpp/632)

🔹پارامتر ها:

🔻مفهوم Alloc :
این همان تخصیص دهنده ی حافظه است. البته وقتی می گوییم تخصیص دهنده نه این که فقط تخصیص می دهد بلکه می تواند حافظه ی گرفته شده را هم به سیستم پس بدهد.

🔻مفهوم N :
این هم که سایز وکتور است. با این که نوشته از نوع size_type است ولی شما با یک عدد معمولی این را مشخص کنید. وقتی می گوییم از نوع size_type است یعنی آن مقدار حافظه ای که می گیرد بستگی به نوع داده های وکتور دارد. می دانید که حجم 20 عدد int با 20 char فرق می کند.

🔻مفهوم Val :
این هم آن مقداری است که می خواهیم کل وکتور تازه تعریف شده را با آن پر کنیم.

🔻مفهوم First,last :
این دو که شاید کمی برای توضیح دادنشان زود باشد. اینها در واقع نوعی خاص هستند که شبیه اشاره گر ها عمل می کنند. داخل STL به اشاره گر ها اصطلاحا iterator گویند. iterator ها در واقع اشاره گر هایی هستند که می توانند به یک قسمت خاصی از وکتور اشاره کنند(مثلا اول یا آخرشان)برای استفاده از آنها هم باید یک آبجکت از نوع آنها تعریف کنیم و بعد به آنها بگوییم که قرار است به کجا اشاره کنند. first و last داخل سازنده همان اشاره گر هایی به اول و آخر وکتوری هستند که قرار است داخل یک وکتور دیگر برود.

🔻مفهوم X :
همون وکتوری است که قرار است مادر یک وکتور جدید بشوند یعنی تقریبا می توانیم به طور کامل بگوییم داخل STL از ارث بری استفاده شده یعنی یک آبجکت می تواند از یک آبجکت دیگر مشتق شود.

🔻مفهوم Li :
همان داده هایی هستند که نوع برای ما مشخص نیست.

🔹یک وکتور چگونه تعریف می شود؟
شما قرار است با نوع جدیدی از تعریف آبجکت آشنا شوید. ما باید به کلاس وکتور بگوییم که قرار است چه نوع داده ای را داخل خودش ذخیره کند. به خط زیر نگاه کنید :
vector<int>:: vec;

ما با این خط یه آبجکت از نوع وکتور تعریف کردیم که می تواند داده هایی از نوع int داخل خودش نگه دارد.

🔹چرا شکل آن اینگونه است؟
چون از template ها استفاده شده است.

🔹چگونه می توانیم ورودی های سازنده را به آن بدهیم ؟خط زیر :
vector<int> vec(پارامترها)


آموزش بعدی سازنده وکتور(t.me/Learncpp/634)

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

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

🔹سازنده vector::vector
🔸آموزش قبلی سازنده وکتور(t.me/Learncpp/633)

شاید زدن همچین مثالی برای شروع کمی گیج کننده باشد ولی حتی اگر به خود معنی لغوی کد هم نگاه کنید می توانید بفهمید که این کد قرار است چه کاری انجام دهد.
1.#include <iostream>

2.#include <vector>

3.using namespace std;


4.int main( )

5.{

6.//constructors used in the same order as described above:


7.vector<int>first

//empty vector of ints


8.vector<int>second(4,100);

//four ints with value 100


9.vector<int>third(second.begin( ),second.end( ));

//iterating through second


10.vector<int>fourth(third); 

//a copy of third


11.//the iterator constructor can also be used to construct from arrays:


12.int myints[ ]={16,2,77,29};

13.vector<int>fifth(myints,myints + sizeof(myints)/sizeof(int));

14.cout<<"The contents of fifth are:";

15.for(vector<int>::iterator it=fifth.begin( );it != fifth.end( );++it)

16.cout<<' '<<*it;

17.cout<<'\n';

18.return 0;

19.}


Output:
The contents of fifth are: 16 2 77 29

🔹در خط 7 یک وکتور کاملا ساده تعریف می کنیم .

🔹در خط 8 یک وکتور تعریف می کنیم که 4 عنصر داره با مقدار 100 پر شدند.

🔹در خط 9، ما در این خط یک وکتور تعریف می کنیم و به آن دستور می دهیم که ابتدای آن باید مساوی با شروع وکتور قبلی باشد و آخر آن مساوی با آخر وکتور قبل باشد یعنی داریم با یک وکتور آن را مقدار دهی می کنیم.

🔹در خط 10 یک وکتور تعریف شده که از وکتور قبلی مشتق می شود یعنی داریم با یک وکتور آن را مقدار دهی می کنیم.

🔹در خط 13 به این وکتور دستور می دهیم که شروعت ابتدای آرایه ی قبلی و پایانت آخر آرایه قبلی باشد یعنی داریم با یک آرایه آن را مقدار دهی می کنیم.

🔹در خط 14 با این حلقه فقط داریم از اول تا اخر وکتور fifth را می رویم و یکی یکی مقادیر داخلش را چاپ می کنیم.

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

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

🔹تابع assing
🔹range (1)
template <class InputIterator>

void assign (InputIterator first,InputIterator last);


🔹fill (2)
void assign (size_type n,const value_type& val);

🔹initializer list (3)
void assign (initializer_list<value_type> il);

درباره ی کار کرد این تابع در سازنده ی کلاس وکتور بحث شده. ما با این متد می توانیم یک مقدار جدید به وکتور بدهیم

🔹مفهوم Range:
با این متد می توانیم دو مقدار جدید به وکتور بدهیم یکی به آخر iterator و یکی به آخر یک سری از داده ها.
مثلا اول و آخر یک وکتور دیگر یا یک آرایه.
درباره آرایه می توانیم همان اشاره گر هایی که به اول و آخر آرایه اشاره می کند به این متد بدهیم

🔹مفهوم Fill :
با این متد می توانیم طول وکتور را تغییر بدهیم و یک مقدار پیش فرض هم به آن بدهیم تا کل محتویات وکتور را با آن پر کند.

🔹مفهوم initializer list :
با این متد هم می شود یک لیست با نوع نامعلوم به وکتور داد.

🔻پارامترها :

🔹مفهوم First_last
این دو می توانند به یک iterator وکتور دیگر اشاره کنند یا اشاره گر به یک آرایه باشند.

🔹مفهوم n :
همان سایزی است که می خواهیم به وکتوربدهیم.

🔹مفهوم Val :
مقدار پیش فرضی است که می خواهیم موقع تغییر طول وکتور داخل عناصر وکتور کپی شود.

🔹مفهوم Li :
این پارامتر هم آن لیستی است که نوعش نامعلوم است.

#include <iostream>

#include <vector>

using namespace std;


int main( )

{

vector<int> first;

vector<int> second;

vector<int> third;


first.assign (7,100);//7 ints with a value of 100


vector<int>::iterator it;

it=first.begin( )+1;


second.assign (it,first.end( )-1);//the 5 central values of first


int myints[ ]={1776,7,4}; third.assign (myints,myints+3);

//assigning from array.


cout<<"Size of first:"<<int (first.size( ))<<'\n';

cout<<"Size of second:"<<int (second.size( ))<<'\n';

cout<<"Size of third:"<<int (third.size( ))<<'\n';

return 0;

}


Output:
Size of first: 7
Size of second: 5
Size of third: 3

درقسمت سازنده ها قبلا توضیح داده شده است پس نیازی به توضیح نیست

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

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

🔹عملگرهای رابطه ای
(1)template <class T, class Alloc>

bool operator== (const vector<T,Alloc>& lhs,const vector<T,Alloc>& rhs);

(2)template <class T, class Alloc>

bool operator!= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);

(3)template <class T, class Alloc>

bool operator< (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);

(4)template <class T, class Alloc>

bool operator<= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);

(5)template <class T, class Alloc>

bool operator> (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);

(6)template <class T, class Alloc>

bool operator>= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs);


تمام عملگر ها برای وکتور ها آورلود شدند.
🔸عملگر مقایسه (==)در ابتدا size( ) دو وکتور رو چک می کند اگر برابر بودند می رود یکی یکی عناصر نظیر به نظیر را با هم چک می کند اولین اختلافی که پیدا کند کار آن تمام می شود ولی اگر تا آخر برود و هیچ اختلافی نداشته باشند دو وکتور با هم برابرند.

🔸عملگر (<) هم همین کار را می کند و از الگوریتم lexicographical_compare برای مقایسه استفاده می کند.

🔸سایر عملگر ها هم از این دو برای کارشون استفاده می کنند. در لیست زیر می توانید معادل عملگر ها رو ببینید :

🔹عملگر معادل عملگر
a!=b !(a==b)
a>b b<a
a<=b !(b<a)
a>=b !(a<b)
🔹پارامتر ها :

🔻مفهومLhs,rhs :
این دوهمان وکتور هایی هستند که باید مقایسه شوند .

🔹مقادیر بازگشتی:
اگر نتیجه ی مقایسه درست باشه true در غیر اینصورت false .

🔹این هم یک مثال خیلی ساده :

#include <iostream>

#include <vector>

using namespace std;


int main ( )

{

vector<int> foo (3,100);// three ints with a value of 100

vector<int> bar (2,200);// two ints with a value of 200

if (foo==bar)

cout<<"foo and bar are equal\n";

if (foo!=bar)

cout<<"foo and bar are not equal\n";

if (foo< bar)

cout<<"foo is less than bar\n";

if (foo> bar)

cout<<"foo is greater than bar\n";

if (foo<=bar)

cout<<"foo is less than or equal to bar\n";

if (foo>=bar)

cout<<"foo is greater than or equal to bar\n";

return 0;

}



Output:
foo and bar are not equal
foo is less than bar
foo is less than or equal to bar

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

@Learncpp
زحمت ترجمه کتابخانه "string"را خانم محبوبه علینقی وآقای عبدالرحمان آزادی کشیدن از دو بزرگوار بخاطر کمکشون
سپاسگزاریم🙏🌺
@learncpp
🔸ترجمه کتابخانه "string (رشته ها)" از سایت رسمی برنامه نویسان ++C به آدرس
www.cplusplus.com/reference

@Learncpp