#vector #crend
🔵وکتور(vector)
🔹تابع Crend
تابع crend یک const_reverse_iterator بر می گرداند که به ما یک دسترسی فقط_خواندنی به آخرینه آخرین عنصر وکتور می دهد و می توانیم مطمئن باشیم که تحت هیچ شرایطی مقدار آخرینه آخرین عنصر تغییر پیدا نمی کند.
🔹مقادیر بازگشتی :
یک const_reverse_iterator به آخرینه آخرین عنصر وکتور.
Output :
235485120
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵وکتور(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
این متد یک دسترسی کامل خواندنی-نوشتنی به اولین عنصر وکتور ما می دهد. دقت کنید که این متد با begin( ) فرق دارد. چون begin( ) یک iterator به اولین عنصر به ما می دهد ولی front( ) یک خود عنصر رو در دسترس ما می گذارد. اگر هیچ داده ای داخل وکتور نباشد
و ما این متد رو صدا بزنیم برنامه یک رفتار غیر قابل پیش بینی انجام می دهد که باعث می شود از طرف سیستم عامل به ما خطا بدهد.
🔹مقادیر بازگشتی :
یک ارجاع کامل به اولین عنصر وکتور .
Output:
myvector.front( ) is now 62
می بینید که با این متد می توانیم هر کاری با اولین عنصر انجام بدهیم. به زبان ساده تر ما می توانیم با آن شبیه یک متغیر معمولی رفتار کنیم.
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵وکتور(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
این متد مقادیر دو وکتور را با هم جابه جا می کند. یعنی داده های داخل x رو داخل y می برد و دادهای y رو در x ولی ...
این متد هیچ کپی یا جابه جا شدنی انجام نمی دهد. یعنی مقادیر داخل x رو کپی در y نمی کند. در عوض تمام اشاره گر های x رو به y می دهد و اشاره گر های y رو به x . منظور از اشارگر همان اشاره گر هایی هستند که به داده ها اشاره می کنند. ولی همه ی اشاره گر ها رو جا به جا نمی کند بلکه آن اشارگری که به اول x اشاره می کند را به y می دهد و برعکس .
فایده این کار چیست؟
تفاوت این دو در سرعت آنهاست که اصلا با هم قابل قیاس نیستند چون در این متد هیچ کپی انجام نمی شود پس سرعتش بالاست.
🔹پارامتر ها :
🔻مفهوم x,y :
دو وکتور که باید جا به جا شوند.
مثال)
Output:
foo contains: 200 200 200 200 200
bar contains: 100 100 100
⚠️یک تابع swap دیگر داریم که در پست (www.tg-me.com/Learncpp/617) توضیح داده شده است
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵وکتور(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 دیگر داریم که در پست (www.tg-me.com/Learncpp/617) توضیح داده شده است
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
Telegram
Learning ©➕➕
#vector #swap
🔵وکتور(vector)
🔹تابع swap
void swap (vector& x);
با این تابع عضو کلاس وکتور می توانیم محتویات دو وکتور که هم نوع هستند(یعنی داده هایی با یک نوع را نگهداری می کنند) را با هم عوض کنیم .
🔹پارامتر ها:
🔻مفهوم X :
یک آبجکت از کلاس وکتور که…
🔵وکتور(vector)
🔹تابع swap
void swap (vector& x);
با این تابع عضو کلاس وکتور می توانیم محتویات دو وکتور که هم نوع هستند(یعنی داده هایی با یک نوع را نگهداری می کنند) را با هم عوض کنیم .
🔹پارامتر ها:
🔻مفهوم X :
یک آبجکت از کلاس وکتور که…
#vector #swap
🔵وکتور(vector)
🔹تابع swap
با این تابع عضو کلاس وکتور می توانیم محتویات دو وکتور که هم نوع هستند(یعنی داده هایی با یک نوع را نگهداری می کنند) را با هم عوض کنیم .
🔹پارامتر ها:
🔻مفهوم X :
یک آبجکت از کلاس وکتور که می خواهیم محتویاتش با آبجکت فراخوان عوض شود.
مثال)
Output :
foo contains: 200 200 200 200 200
bar contains: 100 100 100
⚠️یک تابع swap دیگر داریم که در پست (www.tg-me.com/Learncpp/616) توضیح داده شده است
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵وکتور(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 دیگر داریم که در پست (www.tg-me.com/Learncpp/616) توضیح داده شده است
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
Telegram
Learning ©➕➕
#vector #swap
🔵وکتور(vector)
🔹تابع swap
template <class T, class Alloc>
void swap (vector<T,Alloc>& x, vector<T,Alloc>& y);
این متد مقادیر دو وکتور را با هم جابه جا می کند. یعنی داده های داخل x رو داخل y می برد و دادهای y رو در x ولی ...
این متد هیچ کپی…
🔵وکتور(vector)
🔹تابع swap
template <class T, class Alloc>
void swap (vector<T,Alloc>& x, vector<T,Alloc>& y);
این متد مقادیر دو وکتور را با هم جابه جا می کند. یعنی داده های داخل x رو داخل y می برد و دادهای y رو در x ولی ...
این متد هیچ کپی…
#vector #data
🔵وکتور(vector)
🔹تابع data
متد 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 آدرس اولین خانه ی وکتور را به ما می دهد و ما نسبت به آن آدرس می توانیم به بقیه عناصر دسترسی داشته باشیم.
🔹مقادیر بازگشتی :
یک اشاره گر از نوع داده های ذخیره شده داخل وکتور به اولین عنصر داخل وکتور.
Output:
0x512c90=0
0x512c94=1
0x512c98=2
0x512c9c=3
0x512ca0=4
0x512ca4=5
با این برنامه می توانیم ثابت کنیم که عناصر ذخیره داخل وکتور در حافظه درست مثل آرایه پشت سر هم قرار گرفتند
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵وکتور(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
کار این تابع که تقریبا بهینه سازی حافظه ی وکتور است می دانیم که برای هر بازه ای از تعداد داده ها در یک بازه ی خاص, حافظه گرفته می شود (به تابع capacity مراجعه شود) حال اگر با استفاده از تابع reserve برای کار مهمی یک مقدار خیلی بزرگ بگیریم، می توانیم بعد از این که کار تمام شد کل وکتور را بهینه سازی کنیم تا حافظه هایی را که نیاز ندارد به سیستم برگردانده شود فرض کنید ما 10 تا داده داخل وکتور داریم ولی وکتورمان به اندازه ی 100 تا عنصر حافظه گرفته است با این متد می توانیم تعداد حافظه ها رو به 11 تا کاهش دهیم.
Output:
128
101
🔰ترجمه شده در سایت
www.cplusplus.com
@Learncpp
🔵وکتور(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)
🔹fill (2)
🔹range (3)
🔹copy (4)
🔹move (5)
🔹initializer list (6)
سازنده ی کلاس وکتور چندین آورلود دارد که هر کدام برای یک سطح برنامه نویسی هست که شکل کلی اینها در بالا هست.
🔹حال هرکدام ازاینهاچه کاری می کنند ؟
در ابتدا اینکه هر کدام از این اشکال دو آورلود دارند که دومی آنها با اولی یکی است فقط می توانیم نوع تخصیص دهنده ی حافظه را هم مشخص کنیم از این پارامتر هم داخل سازنده و هم داخل تخریب کننده استفاده می شود برای گرفتن و یا پس دادن حافظه به سیستم .
🔹پارامتر ها
🔻مفهوم Default :
یک وکتور کاملا ساده و خالی درست می کند.
🔻مفهوم Fill :
با این آور لود می توانیم تعداد عناصری که قرار است داخل وکتورمان ذخیره کنیم را مشخص کنیم . با آورلود دومی هم می توانیم تمام خانه های وکتور را با یک مقدار پر کنیم. مثلا پنج خانه که همه آنها با 100 پر می شود.
🔻مفهوم Range :
با این می توانید یک وکتور دیگر را در وکتوری که می خواهیم بسازیم بریزیم. اما باید آدرس شروع و آدرس آخر وکتور را به وکتور جدید بدهیم . این عمل مثل این است که بگوییم این وکتور جدیدی که می خواهیم بسازیم اولش با وکتور مثلا x و آخرش هم با وکتور x برابر باشد که به طبع این وکتور جدید با وکتور قبلی برابر می شود البته این به این معنی نیست که ما فقط می توانیم از یک وکتور استفاده کنیم. با این اورلود می توانیم آدرس اول و آخر یک آرایه را که نوعش با نوع وکتور برابر است را به وکتور هم بدهیم یعنی بگوییم اول وکتور ما برابر با آدرس شروع آرایه ی x باشد و آخرش هم برابر با آخر آرایه ی x. پس خاصیت این آورلود این است که می توانیم یک آرایه را به وکتورمان منتقل کنیم.
🔻مفهوم Copy :
این آورلود کار همان آورلود قبلی را می دهد با این تفاوت که فقط کافی است اسم وکتور قبلی را به آن بدهیم مثلا می گوییم وکتور x برابر وکتور y شود .
🔻مفهوم initializer list :
با این می توانیم یک نوع داده ای را که نوعش برای ما مشخص نیست را در وکتور بریزیم.
آموزش بعدی سازنده وکتور(www.tg-me.com/Learncpp/633)
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵وکتور(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 :
با این می توانیم یک نوع داده ای را که نوعش برای ما مشخص نیست را در وکتور بریزیم.
آموزش بعدی سازنده وکتور(www.tg-me.com/Learncpp/633)
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
Telegram
Learning ©➕➕
#vector #vector::vector
🔵وکتور(vector)
🔹سازنده vector::vector
🔸آموزش قبلی سازنده وکتور(www.tg-me.com/Learncpp/632)
🔹پارامتر ها:
🔻مفهوم Alloc :
این همان تخصیص دهنده ی حافظه است. البته وقتی می گوییم تخصیص دهنده نه این که فقط تخصیص می دهد بلکه می تواند حافظه ی گرفته…
🔵وکتور(vector)
🔹سازنده vector::vector
🔸آموزش قبلی سازنده وکتور(www.tg-me.com/Learncpp/632)
🔹پارامتر ها:
🔻مفهوم Alloc :
این همان تخصیص دهنده ی حافظه است. البته وقتی می گوییم تخصیص دهنده نه این که فقط تخصیص می دهد بلکه می تواند حافظه ی گرفته…
#vector #vector::vector
🔵وکتور(vector)
🔹سازنده vector::vector
🔸آموزش قبلی سازنده وکتور(www.tg-me.com/Learncpp/632)
🔹پارامتر ها:
🔻مفهوم Alloc :
این همان تخصیص دهنده ی حافظه است. البته وقتی می گوییم تخصیص دهنده نه این که فقط تخصیص می دهد بلکه می تواند حافظه ی گرفته شده را هم به سیستم پس بدهد.
🔻مفهوم N :
این هم که سایز وکتور است. با این که نوشته از نوع size_type است ولی شما با یک عدد معمولی این را مشخص کنید. وقتی می گوییم از نوع size_type است یعنی آن مقدار حافظه ای که می گیرد بستگی به نوع داده های وکتور دارد. می دانید که حجم 20 عدد int با 20 char فرق می کند.
🔻مفهوم Val :
این هم آن مقداری است که می خواهیم کل وکتور تازه تعریف شده را با آن پر کنیم.
🔻مفهوم First,last :
این دو که شاید کمی برای توضیح دادنشان زود باشد. اینها در واقع نوعی خاص هستند که شبیه اشاره گر ها عمل می کنند. داخل STL به اشاره گر ها اصطلاحا iterator گویند. iterator ها در واقع اشاره گر هایی هستند که می توانند به یک قسمت خاصی از وکتور اشاره کنند(مثلا اول یا آخرشان)برای استفاده از آنها هم باید یک آبجکت از نوع آنها تعریف کنیم و بعد به آنها بگوییم که قرار است به کجا اشاره کنند. first و last داخل سازنده همان اشاره گر هایی به اول و آخر وکتوری هستند که قرار است داخل یک وکتور دیگر برود.
🔻مفهوم X :
همون وکتوری است که قرار است مادر یک وکتور جدید بشوند یعنی تقریبا می توانیم به طور کامل بگوییم داخل STL از ارث بری استفاده شده یعنی یک آبجکت می تواند از یک آبجکت دیگر مشتق شود.
🔻مفهوم Li :
همان داده هایی هستند که نوع برای ما مشخص نیست.
🔹یک وکتور چگونه تعریف می شود؟
شما قرار است با نوع جدیدی از تعریف آبجکت آشنا شوید. ما باید به کلاس وکتور بگوییم که قرار است چه نوع داده ای را داخل خودش ذخیره کند. به خط زیر نگاه کنید :
ما با این خط یه آبجکت از نوع وکتور تعریف کردیم که می تواند داده هایی از نوع int داخل خودش نگه دارد.
🔹چرا شکل آن اینگونه است؟
چون از template ها استفاده شده است.
🔹چگونه می توانیم ورودی های سازنده را به آن بدهیم ؟خط زیر :
آموزش بعدی سازنده وکتور(www.tg-me.com/Learncpp/634)
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵وکتور(vector)
🔹سازنده vector::vector
🔸آموزش قبلی سازنده وکتور(www.tg-me.com/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(پارامترها)
آموزش بعدی سازنده وکتور(www.tg-me.com/Learncpp/634)
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
Telegram
Learning ©➕➕
#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&…
🔵وکتور(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&…
#vector #vector::vector
🔵وکتور(vector)
🔹سازنده vector::vector
🔸آموزش قبلی سازنده وکتور(www.tg-me.com/Learncpp/633)
شاید زدن همچین مثالی برای شروع کمی گیج کننده باشد ولی حتی اگر به خود معنی لغوی کد هم نگاه کنید می توانید بفهمید که این کد قرار است چه کاری انجام دهد.
Output:
The contents of fifth are: 16 2 77 29
🔹در خط 7 یک وکتور کاملا ساده تعریف می کنیم .
🔹در خط 8 یک وکتور تعریف می کنیم که 4 عنصر داره با مقدار 100 پر شدند.
🔹در خط 9، ما در این خط یک وکتور تعریف می کنیم و به آن دستور می دهیم که ابتدای آن باید مساوی با شروع وکتور قبلی باشد و آخر آن مساوی با آخر وکتور قبل باشد یعنی داریم با یک وکتور آن را مقدار دهی می کنیم.
🔹در خط 10 یک وکتور تعریف شده که از وکتور قبلی مشتق می شود یعنی داریم با یک وکتور آن را مقدار دهی می کنیم.
🔹در خط 13 به این وکتور دستور می دهیم که شروعت ابتدای آرایه ی قبلی و پایانت آخر آرایه قبلی باشد یعنی داریم با یک آرایه آن را مقدار دهی می کنیم.
🔹در خط 14 با این حلقه فقط داریم از اول تا اخر وکتور fifth را می رویم و یکی یکی مقادیر داخلش را چاپ می کنیم.
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵وکتور(vector)
🔹سازنده vector::vector
🔸آموزش قبلی سازنده وکتور(www.tg-me.com/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
Telegram
Learning ©➕➕
#vector #vector::vector
🔵وکتور(vector)
🔹سازنده vector::vector
🔸آموزش قبلی سازنده وکتور(www.tg-me.com/Learncpp/632)
🔹پارامتر ها:
🔻مفهوم Alloc :
این همان تخصیص دهنده ی حافظه است. البته وقتی می گوییم تخصیص دهنده نه این که فقط تخصیص می دهد بلکه می تواند حافظه ی گرفته…
🔵وکتور(vector)
🔹سازنده vector::vector
🔸آموزش قبلی سازنده وکتور(www.tg-me.com/Learncpp/632)
🔹پارامتر ها:
🔻مفهوم Alloc :
این همان تخصیص دهنده ی حافظه است. البته وقتی می گوییم تخصیص دهنده نه این که فقط تخصیص می دهد بلکه می تواند حافظه ی گرفته…
#vector #assing
🔵وکتور(vector)
🔹تابع assing
🔹range (1)
🔹fill (2)
🔹initializer list (3)
درباره ی کار کرد این تابع در سازنده ی کلاس وکتور بحث شده. ما با این متد می توانیم یک مقدار جدید به وکتور بدهیم
🔹مفهوم Range:
با این متد می توانیم دو مقدار جدید به وکتور بدهیم یکی به آخر iterator و یکی به آخر یک سری از داده ها.
مثلا اول و آخر یک وکتور دیگر یا یک آرایه.
درباره آرایه می توانیم همان اشاره گر هایی که به اول و آخر آرایه اشاره می کند به این متد بدهیم
🔹مفهوم Fill :
با این متد می توانیم طول وکتور را تغییر بدهیم و یک مقدار پیش فرض هم به آن بدهیم تا کل محتویات وکتور را با آن پر کند.
🔹مفهوم initializer list :
با این متد هم می شود یک لیست با نوع نامعلوم به وکتور داد.
🔻پارامترها :
🔹مفهوم First_last
این دو می توانند به یک iterator وکتور دیگر اشاره کنند یا اشاره گر به یک آرایه باشند.
🔹مفهوم n :
همان سایزی است که می خواهیم به وکتوربدهیم.
🔹مفهوم Val :
مقدار پیش فرضی است که می خواهیم موقع تغییر طول وکتور داخل عناصر وکتور کپی شود.
🔹مفهوم Li :
این پارامتر هم آن لیستی است که نوعش نامعلوم است.
Output:
Size of first: 7
Size of second: 5
Size of third: 3
درقسمت سازنده ها قبلا توضیح داده شده است پس نیازی به توضیح نیست
🔰ترجمه شده ازسایت
www.cplusplus.com
@Learncpp
🔵وکتور(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)
🔹عملگرهای رابطه ای
تمام عملگر ها برای وکتور ها آورلود شدند.
🔸عملگر مقایسه (==)در ابتدا size( ) دو وکتور رو چک می کند اگر برابر بودند می رود یکی یکی عناصر نظیر به نظیر را با هم چک می کند اولین اختلافی که پیدا کند کار آن تمام می شود ولی اگر تا آخر برود و هیچ اختلافی نداشته باشند دو وکتور با هم برابرند.
🔸عملگر (<) هم همین کار را می کند و از الگوریتم lexicographical_compare برای مقایسه استفاده می کند.
🔸سایر عملگر ها هم از این دو برای کارشون استفاده می کنند. در لیست زیر می توانید معادل عملگر ها رو ببینید :
🔹عملگر معادل عملگر
a!=b !(a==b)
a>b b<a
a<=b !(b<a)
a>=b !(a<b)
🔹پارامتر ها :
🔻مفهومLhs,rhs :
این دوهمان وکتور هایی هستند که باید مقایسه شوند .
🔹مقادیر بازگشتی:
اگر نتیجه ی مقایسه درست باشه true در غیر اینصورت false .
🔹این هم یک مثال خیلی ساده :
Output:
foo and bar are not equal
foo is less than bar
foo is less than or equal to bar
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵وکتور(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
سپاسگزاریم🙏🌺
@learncpp
🔸ترجمه کتابخانه "string (رشته ها)" از سایت رسمی برنامه نویسان ++C به آدرس
www.cplusplus.com/reference
@Learncpp
www.cplusplus.com/reference
@Learncpp
#cstring #string.h #memcpy
🔵رشته ها (string)
🔹تابع memcpy
این تابع قسمتی از آرایه را در آرایه ی دیگر کپی می کند.
در الگوی فوق from اشاره گری است که به آرایه ی منبع ( آرایه ای که کاراکتر های مورد نظر در آنجا قرار دارند) و to اشاره گری است که به آرایه ی مقصد (آرایه ای که کاراکتر ها باید به آنجا کپی شوند ) اشاره می کند. تعداد کاراکتر هایی که باید کپی شوند با آرگومان count مشخص می شوند برای مثال اگر count برابر با 10، یعنی اولین 10 کاراکتر آرایه باشد، from باید به 10 محل اول آرایه ی to کپی شود. همانطور که از الگوی این تابع پیداست این تابع اشاره گری است که پس از مقایسه به آرایه ای اشاره می کند که to به آن اشاره می کرده است.
مثال)
Output:
Person_copy :
Ali_zamani, 46
مثال)
Output:
Before memcpy dest=
After memcpy dest = @Learncpp
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵رشته ها (string)
🔹تابع memcpy
void *memcpy(void *to,const void *from,unsigned count)
این تابع قسمتی از آرایه را در آرایه ی دیگر کپی می کند.
در الگوی فوق from اشاره گری است که به آرایه ی منبع ( آرایه ای که کاراکتر های مورد نظر در آنجا قرار دارند) و to اشاره گری است که به آرایه ی مقصد (آرایه ای که کاراکتر ها باید به آنجا کپی شوند ) اشاره می کند. تعداد کاراکتر هایی که باید کپی شوند با آرگومان count مشخص می شوند برای مثال اگر count برابر با 10، یعنی اولین 10 کاراکتر آرایه باشد، from باید به 10 محل اول آرایه ی to کپی شود. همانطور که از الگوی این تابع پیداست این تابع اشاره گری است که پس از مقایسه به آرایه ای اشاره می کند که to به آن اشاره می کرده است.
مثال)
#include <iostream>
#include <string.h>
using namespace std;
struct{
char name[40];
int age;
}person,person_copy;
int main( )
{
char myname[ ]="Ali_zamani";
/*using memcpy to copy string:*/
memcpy(person.name,myname,strlen(myname)+1);
person.age=46;
/*using memcpy to copy structure:*/
memcpy(&person_copy,&person,sizeof(person));
cout<<"person_copy:\n"<<person_copy.name,person_copy.age;
return 0;
}
Output:
Person_copy :
Ali_zamani, 46
مثال)
#include <string.h>
#include <iostream>
using namespace std;
int main ( )
{
const char src[10] = "@Learncpp";
char dest[10];
cout<<"Before memcpy dest = \n"<<dest;
memcpy(dest, src, strlen(src) + 1);
cout<<"\n After memcpy dest= \n"<<dest;
return 0;
}
Output:
Before memcpy dest=
After memcpy dest = @Learncpp
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
#cstring #string.h #memmove
🔵رشته ها (string)
🔹تابع memmove
این تابع تعدادی از کاراکترها را از آرایه ای به آرایه دیگر کپی می کند. تفاوت آن با memcpy در این است که اگر در تابع memcpy دو آرایه روی هم قرار گرفته باشند عمل کپی انجام نمی شود ولی در تابع memmove عمل کپی به درستی انجام می شود.
آرایه ای که from به آن اشاره می کند آرایه ی منبع و آرایه ای که to به آن اشاره می کند آرایه مقصد است
🔹پارامتر ها:
🔻مفهوم count :
مشخص می کند که چه تعداد کاراکتر از آرایه منبع به آرایه مقصد کپی شوند.
مثال)
Output:
Memmove can be very very useful.
مثال)
Output:
Before memmove dest = oldstring, src = newstring
After memmove dest = newstring, src = newstring
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵رشته ها (string)
🔹تابع memmove
void *memmove(void *to, const void *from,unsigned count)
این تابع تعدادی از کاراکترها را از آرایه ای به آرایه دیگر کپی می کند. تفاوت آن با memcpy در این است که اگر در تابع memcpy دو آرایه روی هم قرار گرفته باشند عمل کپی انجام نمی شود ولی در تابع memmove عمل کپی به درستی انجام می شود.
آرایه ای که from به آن اشاره می کند آرایه ی منبع و آرایه ای که to به آن اشاره می کند آرایه مقصد است
🔹پارامتر ها:
🔻مفهوم count :
مشخص می کند که چه تعداد کاراکتر از آرایه منبع به آرایه مقصد کپی شوند.
مثال)
#include <iostream>
#include <string.h>
using namespace std;
int main ( )
{
char str[ ]="memmove can be very useful...";
memmove(str+20,str+15,11);
puts(str);
return 0;
}
Output:
Memmove can be very very useful.
مثال)
#include <string.h>
#include <iostream>
using namespace std;
int main ( )
{
char dest[ ]="oldstring";
const char src[ ]="newstring";
cout<<"Before memmove dest = "<<src<<endl<<dest<<" "<<src;
memmove(dest,src,9);
cout<<"\nAfter memmove dest "<<src<<endl<<dest<<" "<<src;
return 0;
}
Output:
Before memmove dest = oldstring, src = newstring
After memmove dest = newstring, src = newstring
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
#cstring #string.h #strcpy
🔵رشته ها (string)
🔹تابع strcpy
این تابع تعداد مشخصی از کاراکترهای رشته را در رشته ای دیگر کپی می کند
در الگوی فوق به تعداد count کاراکتر از رشته str2 در رشته str1 با شروع از ابتدای رشته ها کپی می شوند اگر تعداد کاراکترهایی که در str2 وجود دارند کمتر از مقدار count باشند به تعداد لازم کاراکتر تهی در انتهای str1 کپی می شوند.
مثال)
Output:
Str1 : sample string
Str2 : sample string
Str3 : copy successful
مثال)
Output:
Final copied string : Learn c++ in @Learncpp
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵رشته ها (string)
🔹تابع strcpy
char *strcpy(char *str1,const char *str2,unsigned count)
این تابع تعداد مشخصی از کاراکترهای رشته را در رشته ای دیگر کپی می کند
در الگوی فوق به تعداد count کاراکتر از رشته str2 در رشته str1 با شروع از ابتدای رشته ها کپی می شوند اگر تعداد کاراکترهایی که در str2 وجود دارند کمتر از مقدار count باشند به تعداد لازم کاراکتر تهی در انتهای str1 کپی می شوند.
مثال)
#include <iostream>
#include <string.h>
using namespace std;
int main( )
{
char str1[ ]="sample string";
char str2[40];
char str3[40];
strcpy(str2 , str1);
strcpy(str3 ,"copy successful");
cout<<"str1:"<<str1<<"\nstr2:"<<str2<<"\nstr3:"<<str3;
return 0;
}
Output:
Str1 : sample string
Str2 : sample string
Str3 : copy successful
مثال)
#include <iostream>
#include <string.h>
using namespace std;
int main( )
{
char src[40];
char dest[100];
memset(dest,'\0',sizeof(dest));
strcpy(src,"Learn c++ in @Learncpp");
strcpy(dest,src);
cout<<"Final copied string:\n"<<dest;
return 0;
}
Output:
Final copied string : Learn c++ in @Learncpp
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
#cstring #string.h #strncpy
🔵رشته ها (string)
🔹تابع strncpy
این تابع یک مقدار از یک رشته را که ما مشخص می کنیم را درون یک رشته دیگر کپی می کند ولی رشته ی دوم را هیچ تغییری نمی دهد یعنی اگر یک قسمت از رشته ی دوم را درون رشته اول کپی کند آن قسمت از رشته دوم در مکانش مانده و هیچ تغییری نمی کند
🔹پارامتر ها:
🔻مفهوم destination :
این یک اشاره گر و رشته خالی هست که می خواهیم رشته ای داخل آن قرار دهیم
🔻مفهوم source :
این همان رشته ای است که می خواهیم قسمتی از آن را در destination کپی کنیم
🔻مفهوم num :
به اندازه ی num کاراکتر از source داخلdestination کپی می شود کاری هم نداشته باشیم size_t چی هست فقط آن تعداد کاراکتری که لازم داریم تعداد آن را جای num قرار می دهیم
🔹مقادیر بازگشتی :
مقدار destination را بر می گرداند.
Output:
To be or not to be
To be or not to be
To be
در این مثال str1 معرفی و با جمله ی معروف شکسپیر مقداردهی می شود ولی str2 و str3 فقط تعریف می شوند.
در خط 10 کل str1 در str2 کپی می شود اما چگونه؟
وقتی ما می گوییم sizeof(str1) یعنی آن مقدار حافظه ای که توسط str1 گرفته شده را به ما بدهد و از قضا مقدار حافظه ی str1 با تعداد کاراکترهای آن یکی می شود، چرا؟
چون هر کاراکتر از لحاظ غیر رسمی فقط یک بایت حافظه می گیرد یعنی مثلا اگر str1 به تعداد 18 کارکتر داشته باشد 18 تا یک بایت می شود 18 بایت پس sizeof(str1) می شود 18 و این تابع هم تمام 18 کاراکتر str1 رو داخل str2 کپی می کند.
در خط 12 فقط 5 کاراکتر از str2 کپی می شود در str3
و در خط 14 مقدار null به آخر str3 اضافه می شود تا آخر آن معلوم شود . دلیل آن هم این هست که این تابع خود به خود مقدار null را بهdestination اضافه نمی کند
در پایان تمام آنها را چاپ میکند ...
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵رشته ها (string)
🔹تابع strncpy
char *strncpy(char *destination,const char *source,size_t num);
این تابع یک مقدار از یک رشته را که ما مشخص می کنیم را درون یک رشته دیگر کپی می کند ولی رشته ی دوم را هیچ تغییری نمی دهد یعنی اگر یک قسمت از رشته ی دوم را درون رشته اول کپی کند آن قسمت از رشته دوم در مکانش مانده و هیچ تغییری نمی کند
🔹پارامتر ها:
🔻مفهوم destination :
این یک اشاره گر و رشته خالی هست که می خواهیم رشته ای داخل آن قرار دهیم
🔻مفهوم source :
این همان رشته ای است که می خواهیم قسمتی از آن را در destination کپی کنیم
🔻مفهوم num :
به اندازه ی num کاراکتر از source داخلdestination کپی می شود کاری هم نداشته باشیم size_t چی هست فقط آن تعداد کاراکتری که لازم داریم تعداد آن را جای num قرار می دهیم
🔹مقادیر بازگشتی :
مقدار destination را بر می گرداند.
1. #include <iostream>
2. #include <string.h>
3. using namespace std;
4. int main ( )
5. {
6. char str1[ ]="To be or not to be";
7. char str2[40];
8. char str3[40];
9. /*copy to sized buffer (overflow safe):*/
10. strncpy(str2,str1,sizeof(str2) );
11. /*partial copy (only 5 chars):*/
12. strncpy(str3,str2,5);
13. /*null character manually added*/
14. str3[5] = '\0';
15. puts (str1);
16. puts (str2);
17. puts (str3);
18. return 0;
19. }
Output:
To be or not to be
To be or not to be
To be
در این مثال str1 معرفی و با جمله ی معروف شکسپیر مقداردهی می شود ولی str2 و str3 فقط تعریف می شوند.
در خط 10 کل str1 در str2 کپی می شود اما چگونه؟
وقتی ما می گوییم sizeof(str1) یعنی آن مقدار حافظه ای که توسط str1 گرفته شده را به ما بدهد و از قضا مقدار حافظه ی str1 با تعداد کاراکترهای آن یکی می شود، چرا؟
چون هر کاراکتر از لحاظ غیر رسمی فقط یک بایت حافظه می گیرد یعنی مثلا اگر str1 به تعداد 18 کارکتر داشته باشد 18 تا یک بایت می شود 18 بایت پس sizeof(str1) می شود 18 و این تابع هم تمام 18 کاراکتر str1 رو داخل str2 کپی می کند.
در خط 12 فقط 5 کاراکتر از str2 کپی می شود در str3
و در خط 14 مقدار null به آخر str3 اضافه می شود تا آخر آن معلوم شود . دلیل آن هم این هست که این تابع خود به خود مقدار null را بهdestination اضافه نمی کند
در پایان تمام آنها را چاپ میکند ...
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
#cstring #string.h #strcat
🔵رشته ها (string)
🔹تابع strcat
این تابع که داخل لیست مهم ترین توابع کار با رشته ها قرار می گیرد یک رشته را به یک رشته ی دیگر وصل می کند ولی باید دقت کنیم که کاراکتر null که آخر destination هست حذف می شود و به جای آن اولین کاراکتر source اضافه می شود و یک کاراکتر null به انتها رشته ی جدید اضافه می شود.
🔹پارامتر ها:
🔻مفهوم destination :
این یک اشاره گر به همان رشته ای است که قرار است بزرگتر شود یا به عبارتی یک رشته ی دیگر به انتهای آن وصل می شود البته باید طول آن به اندازه ای باشد که بتواند یک رشته ی دیگر را داخل خودش جای دهد و اگر نه معلوم نیست اگر طولش کم باشد کاراکتر هایی که داخل این رشته فضایی نگرفتند کجای حافظه گم شوند.
🔻مفهوم source :
این همان رشته ای است که قرار است به انتهاdestination اضافه شود و صد البته که نمی تواند خود destination باشد.
ولی اگر می خواهیم یک رشته را به انتها خودش اضافه کنیم باید آن را داخل یک رشته ی دیگر کپی کنیم سپس آن رشته جدید را به آخر رشته ی خودمان اضافه کنیم.
مثال)
Output:
these strings are concatenated.
در این مثال ابتدا یک رشته را با strcpy داخل str کپی می کند سپس با هر بار اجرای strcat یک کلمه را به انتها str اضافه می کند تا یک جمله ی کامل شکل بگیرد
Output :
@Learncpp@Learncpp
این همان مسئله ای است که گفته شد که چطور یک رشته را به انتها خودش اضافه کنیم .
- فراموش نکنیم کار strcpy این است که یک رشته را در یک رشته دیگر کپی می کند.
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵رشته ها (string)
🔹تابع strcat
char *strcat(char *destination,const char *source);
این تابع که داخل لیست مهم ترین توابع کار با رشته ها قرار می گیرد یک رشته را به یک رشته ی دیگر وصل می کند ولی باید دقت کنیم که کاراکتر null که آخر destination هست حذف می شود و به جای آن اولین کاراکتر source اضافه می شود و یک کاراکتر null به انتها رشته ی جدید اضافه می شود.
🔹پارامتر ها:
🔻مفهوم destination :
این یک اشاره گر به همان رشته ای است که قرار است بزرگتر شود یا به عبارتی یک رشته ی دیگر به انتهای آن وصل می شود البته باید طول آن به اندازه ای باشد که بتواند یک رشته ی دیگر را داخل خودش جای دهد و اگر نه معلوم نیست اگر طولش کم باشد کاراکتر هایی که داخل این رشته فضایی نگرفتند کجای حافظه گم شوند.
🔻مفهوم source :
این همان رشته ای است که قرار است به انتهاdestination اضافه شود و صد البته که نمی تواند خود destination باشد.
ولی اگر می خواهیم یک رشته را به انتها خودش اضافه کنیم باید آن را داخل یک رشته ی دیگر کپی کنیم سپس آن رشته جدید را به آخر رشته ی خودمان اضافه کنیم.
مثال)
#include <iostream>
#include <string.h>
using namespace std;
int main ( )
{
char str[80];
strcpy(str,"these ");
strcat(str,"strings ");
strcat(str,"are ");
strcat(str,"concatenated.");
puts(str);
return 0;
}
Output:
these strings are concatenated.
در این مثال ابتدا یک رشته را با strcpy داخل str کپی می کند سپس با هر بار اجرای strcat یک کلمه را به انتها str اضافه می کند تا یک جمله ی کامل شکل بگیرد
#include <iostream>
#include <string.h>
using namespace std;
int main( )
{
char str[20],temp[20];
strcpy(str,"@Learncpp");
strcpy(temp,str);
strcat(str,temp);
puts(str);
return 0;
}
Output :
@Learncpp@Learncpp
این همان مسئله ای است که گفته شد که چطور یک رشته را به انتها خودش اضافه کنیم .
- فراموش نکنیم کار strcpy این است که یک رشته را در یک رشته دیگر کپی می کند.
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
#cstring #string.h #strncat
🔵رشته ها (string)
🔹تابع strncat
این تابع به اندازه ی num کاراکتر را از source به آخر destination اضافه می کند و اگر تعداد کل کاراکترهای source از num کمتر باشد
مثلا اگر source به تعداد 5 کاراکتر داشته باشد ولی num دارای 8 کاراکتر باشد تابع، باقی مانده آن را با null پر می کند.
در مثالی که زدیم num سه کاراکتر از source بیشتر است پس 3 کاراکتر آخر destination را با null پر می کند.
🔹پارامتر ها:
🔻مفهوم destination :
یک اشاره گر به رشته ای که قرار است بزرگتر شود یا همان رشته ای که قرار است یک رشته ی دیگر به آخر آن اضافه شود.
🔻مفهوم source :
این همان رشته ای است که قرار است یک قسمت از آن به آخر destination اضافه شود.
🔻مفهوم num :
این پارامتر یعنی به تعداد num کاراکتر از source به آخر destination اضافه شود.
🔹مقادیر بازگشتی :
کل destination را بر می گرداند.
مثال)
Output:
To be or not
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵رشته ها (string)
🔹تابع strncat
char *strncat(char *destination,const char *source, size_t num);
این تابع به اندازه ی num کاراکتر را از source به آخر destination اضافه می کند و اگر تعداد کل کاراکترهای source از num کمتر باشد
مثلا اگر source به تعداد 5 کاراکتر داشته باشد ولی num دارای 8 کاراکتر باشد تابع، باقی مانده آن را با null پر می کند.
در مثالی که زدیم num سه کاراکتر از source بیشتر است پس 3 کاراکتر آخر destination را با null پر می کند.
🔹پارامتر ها:
🔻مفهوم destination :
یک اشاره گر به رشته ای که قرار است بزرگتر شود یا همان رشته ای که قرار است یک رشته ی دیگر به آخر آن اضافه شود.
🔻مفهوم source :
این همان رشته ای است که قرار است یک قسمت از آن به آخر destination اضافه شود.
🔻مفهوم num :
این پارامتر یعنی به تعداد num کاراکتر از source به آخر destination اضافه شود.
🔹مقادیر بازگشتی :
کل destination را بر می گرداند.
مثال)
#include <iostream>
#include <string.h>
using namespace std;
int main ( )
{
char str1[20];
char str2[20];
strcpy(str1,"To be ");
strcpy(str2,"or not to be");
strncat(str1, str2, 6);
puts(str1);
return 0;
}
Output:
To be or not
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
#cstring #string.h #strcmp
🔵رشته ها (string)
🔹تابع strcmp
این تابع شروع به مقایسه ی کاراکتر های هر دو رشته از ابتدای آنها می کند تا به اولین مورد اختلاف برسد
اگر کاراکتر مربوط به str1 بزرگتر از کاراکتر مربوط به str2 باشد، مقداری مثبت یعنی عدد 1 را برمی گرداند این بدان مفهوم است که str1>str2.
هم چنین به عکس اگر کاراکتر مربوط به str1 کوچکتر از کاراکتر مربوط به str2 باشد، مقداری منفی یعنی عدد 1- را به مفهوم اینکه str1<str2 است، بر می گرداند.
اگر دو رشته با هم مساوی باشند، مقدار 0 را بر می گرداند.
مثال)
output
Guess my favourite fruit? orange
Guess my favourite fruit? apple
Correct answer!
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵رشته ها (string)
🔹تابع strcmp
int strcmp(const char *str1,const char *str2);
این تابع شروع به مقایسه ی کاراکتر های هر دو رشته از ابتدای آنها می کند تا به اولین مورد اختلاف برسد
اگر کاراکتر مربوط به str1 بزرگتر از کاراکتر مربوط به str2 باشد، مقداری مثبت یعنی عدد 1 را برمی گرداند این بدان مفهوم است که str1>str2.
هم چنین به عکس اگر کاراکتر مربوط به str1 کوچکتر از کاراکتر مربوط به str2 باشد، مقداری منفی یعنی عدد 1- را به مفهوم اینکه str1<str2 است، بر می گرداند.
اگر دو رشته با هم مساوی باشند، مقدار 0 را بر می گرداند.
مثال)
#include <iostream>
#include <string.h>
using namespace std;
int main ( )
{
char key[ ] = "apple";
char buffer[80];
do {
cout<<"Guess my favorite fruit? ";
Cout<<flush;
Cin>>buffer;
} while (strcmp (key,buffer) != 0);
Cout<<"Correct answer!";
return 0;
}
output
Guess my favourite fruit? orange
Guess my favourite fruit? apple
Correct answer!
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp