#vector
🔵 وکتور(vector) چیست
خوب اول ما باید بدونیم وکتور یا همون بردار چیه تا بتونیم تشخیص بدیم که کجا باید ازش استفاده کنیم شما تا حالا حتما از آرایه ها استفاده کردید و حتما بزرگ ترین مشکل آرایه ها رو هم میدونید و اون مشکل همون ثابت بودن طول آرایه است، یعنی شما اول یک آرایه با طول مشخص تعیین میکنید بعد فقط و فقط به همون تعدادی که تعریف کردید میتونید داده داخل آرایه تعریف کنید که این خصوصیت مشکلات زیادی رو به دنبال داره اگه یک ذره تو عمق برنامه نویسی رفته باشید حتما تونستید راه حل این مشکل رو پیدا کنید و اون راه حل حتما استفاده از لینک لیست ها (linklist) به جای آرایه است. خوب لینک لیست هم مشکلات خودش رو داره که مهم ترین مشکلش پیاده سازیشه یعنی شما باید کلی وقت بزارین یک لینک لیست طراحی کنین تا بتونید ازش تو برنامه های مختلف استفاده کنید یکی دیگه از مشکلاتش اینه که لینک لیست داده هایی با انواع ثابت رو میتونه تو خودش نگهداره یعنی وقتی شما لینک لیستتون رو واسه نوع int تعریف میکنید فقط میتونید نوع int رو داخلش ذخیره کنید.
حالا سی پلاس اومده وکتور(vector) رو طراحی کرده تا همه ی این مشکلات رو یه جا از بین ببره. شما توی وکتور میتونید هر نوع داده ای رو حتی داده های تعرف شده توسط کاربر یا همون struct رو یا حتی یه کلاسی رو که خودتون طراحی کردید رو داخلش ذخیره کنید حتی میتونید داده ها رو مثل آرایه ها با اندیسشون بخونید یکی دیگه از خواصش اینه که وکتور میتونه تا n داده رو داخله خودش ذخیره کنه که n بستگی به حجم حافظه ی شما داره یا اینکه می تونید به اول و وسط و آخر وکتور داده ای اضافه یا حذف کنید
اما پیاده سازی وکتور چطوریه؟
کار وکتور مثه اینه که وقتی می خواهید یه داده ی جدید رو به لیست ما اضافه کنه میاد یه آرایه با طول خود لیست به اضافه ی یک تعریف میکنه ، بعد کل لیست رو منتقل میکنه تو لیست جدید و بعدشم داده ی جدید رو به ته لیست اضافه میکنه. سی پلاس این کارو نمیکنه . چرا ؟؟؟ شما بیایید فرض کنید 1000000 تا داده داخل لیست ما قرار داره و ما میخواییم یه داده به ته لیست اضافه کنیم خوب طبق تعریف قبل ما باید بیاییم یه آرایه با طول 1000001 تعریف کنیم بعد 1000000 تا داده ی اولی رو بریزیم تو 1000000 عنصر اول آرایه بعدم اون یه دونه داده رو به خونه ی 1000001 اضافه کنیم . خوب به نظر شما انتقال 1000000 داده به یه لیست جدید چقد طول میکشه ؟؟؟ و این زمان اصلا به صرفه نیست پس وکتور چجوری داده ها رو ذخیره میکنه ؟؟؟ باید بگم خود سایت سی پلاس هیچ حرفی در این مورد نزده و فقط گفته که از استراتیژی های خاصی استفاده میکنه.
و اما بریم سر بحث انواعی که میتونیم داخل وکتور ذخیره کنیم یا به قول سایت سی پلاس Template parameters . ما میتونیم داخل وکتور هر نوع داده ای رو که بهش میدیم رو ذخیره کنیم و صد البته فقط همون نوعی رو میتونیم ذخیره کنیم که بهش معرفی میکنیم . اگه int معرفی کردیم فقط int ، اگه char معرفی کردیم فقط char و خلاصه . حتی میتونیم یه کلاس رو داخلش ذخیره کنیم یا حتی یه struct یا unionو حتی یه وکتور دیگه ...
و اما به عنوان ورودی های وکتور غیر از Template parameters که اجباریه یه ورودیه اختیاری هم میتونیم به وکتور بدیم و اون هم یه تخصیص دهنده است.
حالا تخصیص دهنده چیه؟
تخصیص دهنده همون موتوریه که کارش گرفتنه حافظه واسه داده ها مونه البته این دیگه خیلی تخصصی میشه و داخل خود سایت سی پلاس هم توضیح نداده پس منم توضیح نمیدم
🔰ترجمه شده از سایت www.cplusplus.com
🔻توضیحات اضافه
از مطلب بالا میشه نتیجه گرفت که استفاده از وکتور ها(بردار ها) قابلیت های زیر را به برنامه نویس می دهند:
🔹کارکرد وکتورها شبیه آرایه هاست
🔹در وکتورها میتوانیم قبل از تعریف اندازه وکتور را از کاربر بگیریم
🔹 پس از تعریف وکتورها میتوانیم ظرفیت وکتور(طول وکتور) را به اندازه دلخواه زیادتر کنیم
🔹پس از تعریف وکتورها می توانیم در ابتدا, اواسط یا انتهای وکتور مقداری را اضافه یا حذف کنیم
@Learncpp
🔵 وکتور(vector) چیست
خوب اول ما باید بدونیم وکتور یا همون بردار چیه تا بتونیم تشخیص بدیم که کجا باید ازش استفاده کنیم شما تا حالا حتما از آرایه ها استفاده کردید و حتما بزرگ ترین مشکل آرایه ها رو هم میدونید و اون مشکل همون ثابت بودن طول آرایه است، یعنی شما اول یک آرایه با طول مشخص تعیین میکنید بعد فقط و فقط به همون تعدادی که تعریف کردید میتونید داده داخل آرایه تعریف کنید که این خصوصیت مشکلات زیادی رو به دنبال داره اگه یک ذره تو عمق برنامه نویسی رفته باشید حتما تونستید راه حل این مشکل رو پیدا کنید و اون راه حل حتما استفاده از لینک لیست ها (linklist) به جای آرایه است. خوب لینک لیست هم مشکلات خودش رو داره که مهم ترین مشکلش پیاده سازیشه یعنی شما باید کلی وقت بزارین یک لینک لیست طراحی کنین تا بتونید ازش تو برنامه های مختلف استفاده کنید یکی دیگه از مشکلاتش اینه که لینک لیست داده هایی با انواع ثابت رو میتونه تو خودش نگهداره یعنی وقتی شما لینک لیستتون رو واسه نوع int تعریف میکنید فقط میتونید نوع int رو داخلش ذخیره کنید.
حالا سی پلاس اومده وکتور(vector) رو طراحی کرده تا همه ی این مشکلات رو یه جا از بین ببره. شما توی وکتور میتونید هر نوع داده ای رو حتی داده های تعرف شده توسط کاربر یا همون struct رو یا حتی یه کلاسی رو که خودتون طراحی کردید رو داخلش ذخیره کنید حتی میتونید داده ها رو مثل آرایه ها با اندیسشون بخونید یکی دیگه از خواصش اینه که وکتور میتونه تا n داده رو داخله خودش ذخیره کنه که n بستگی به حجم حافظه ی شما داره یا اینکه می تونید به اول و وسط و آخر وکتور داده ای اضافه یا حذف کنید
اما پیاده سازی وکتور چطوریه؟
کار وکتور مثه اینه که وقتی می خواهید یه داده ی جدید رو به لیست ما اضافه کنه میاد یه آرایه با طول خود لیست به اضافه ی یک تعریف میکنه ، بعد کل لیست رو منتقل میکنه تو لیست جدید و بعدشم داده ی جدید رو به ته لیست اضافه میکنه. سی پلاس این کارو نمیکنه . چرا ؟؟؟ شما بیایید فرض کنید 1000000 تا داده داخل لیست ما قرار داره و ما میخواییم یه داده به ته لیست اضافه کنیم خوب طبق تعریف قبل ما باید بیاییم یه آرایه با طول 1000001 تعریف کنیم بعد 1000000 تا داده ی اولی رو بریزیم تو 1000000 عنصر اول آرایه بعدم اون یه دونه داده رو به خونه ی 1000001 اضافه کنیم . خوب به نظر شما انتقال 1000000 داده به یه لیست جدید چقد طول میکشه ؟؟؟ و این زمان اصلا به صرفه نیست پس وکتور چجوری داده ها رو ذخیره میکنه ؟؟؟ باید بگم خود سایت سی پلاس هیچ حرفی در این مورد نزده و فقط گفته که از استراتیژی های خاصی استفاده میکنه.
و اما بریم سر بحث انواعی که میتونیم داخل وکتور ذخیره کنیم یا به قول سایت سی پلاس Template parameters . ما میتونیم داخل وکتور هر نوع داده ای رو که بهش میدیم رو ذخیره کنیم و صد البته فقط همون نوعی رو میتونیم ذخیره کنیم که بهش معرفی میکنیم . اگه int معرفی کردیم فقط int ، اگه char معرفی کردیم فقط char و خلاصه . حتی میتونیم یه کلاس رو داخلش ذخیره کنیم یا حتی یه struct یا unionو حتی یه وکتور دیگه ...
و اما به عنوان ورودی های وکتور غیر از Template parameters که اجباریه یه ورودیه اختیاری هم میتونیم به وکتور بدیم و اون هم یه تخصیص دهنده است.
حالا تخصیص دهنده چیه؟
تخصیص دهنده همون موتوریه که کارش گرفتنه حافظه واسه داده ها مونه البته این دیگه خیلی تخصصی میشه و داخل خود سایت سی پلاس هم توضیح نداده پس منم توضیح نمیدم
🔰ترجمه شده از سایت www.cplusplus.com
🔻توضیحات اضافه
از مطلب بالا میشه نتیجه گرفت که استفاده از وکتور ها(بردار ها) قابلیت های زیر را به برنامه نویس می دهند:
🔹کارکرد وکتورها شبیه آرایه هاست
🔹در وکتورها میتوانیم قبل از تعریف اندازه وکتور را از کاربر بگیریم
🔹 پس از تعریف وکتورها میتوانیم ظرفیت وکتور(طول وکتور) را به اندازه دلخواه زیادتر کنیم
🔹پس از تعریف وکتورها می توانیم در ابتدا, اواسط یا انتهای وکتور مقداری را اضافه یا حذف کنیم
@Learncpp
#vector
🔵 وکتور(vector)
🔻توضیحات اضافه
🔹نحوه فراخوانی هدر وکتور
🔹نحوه تعریف وکتور
🔹نوع داده ها(data type): توضیحات بیشتر در پست telegram.me/Learncpp/91
@Learncpp
🔵 وکتور(vector)
🔻توضیحات اضافه
🔹نحوه فراخوانی هدر وکتور
#include <vector>🔹نحوه تعریف وکتور
vector <data type> vector_name;
vector <data type> vector_name(ظرفیت اولیه);
vector <data type> vector_name(ظرفیت اولیه,مقدار اولیه);
vector <data type> vector_name(اشاره گر ابتدای حافظه,اشاره گر انتهای حافظه)
🔹نوع داده ها(data type): توضیحات بیشتر در پست telegram.me/Learncpp/91
@Learncpp
Telegram
Learning ©➕➕
انواع داده ها و مقادیر قابل قبول آنها
@Learncpp
@Learncpp
#vector #pop_back
🔵 وکتور(vector)
🔹تابع pop_back
این متد بدون هیچ شرطی آخرین عنصر موجود در وکتور رو حذف میکنه ، ولو یه عنصر باشه . همون طور که میبینید هیچ پارامتر یا مقدار بازگشتی هم ندارد
Output :
The elements of myvector add up to 600
این برنامه سه تا داده رو به وکتور اضافه میکنه بعد با یه حلقه مقدار آخرین عنصر رو با یه متغییر جمع میزنه بعدم همون عنصر رو حذف میکنه تا موقعی که وکتور کاملا خالی بشه
🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
🔵 وکتور(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
تابع push_back یه عنصر به آخر وکتور اضافه میکند این عنصری که ما به آخر وکتور اضافه میکنیم هم میتونه مقدار یک متغییر باشد هم یک مقدار صریح که ما به متد میدیم. وقتی ما یه عنصر به آخر وکتور اضافه میکنیم پس قطعا طول اون هم بیشتر میشه و حتی ممکنه ظرفیت (capacity) وکتور هم بیشتر بشه
این متد خودش اتوماتیک میتونه حافظه ی مورد نیازه داده ی جدید رو تخصیص بده
پارامتر ها:
متغییر val: همون عنصری که باید به آخر وکتور اضافه بشه
در مثال بالا ما یک سری داده رو از کاربر میگریم و تا موقعی که اون داده 0 نیست داده ها رو به آخر وکتور اضافه میکنیم به همین سادگی.
🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
🔵 وکتور(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(قسمت اول)
متد 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 به اولین عنصری که به وکتور اضافه شده. اگر یکی باشد به همان یکی اشاره میکند
22.Output:
23.myvector contains: 501 502 503 300 300 400 400 200 100 100 100
خط 5:
تعریف یک وکتور با طول 3 و مقدار پیشفرض 100, پس تا الان :
خط 8:
دادن یک iterator و مقدار 200 به متد. چون این iterator به اول وکتور اشاره میکند پس این مقدار به اول وکتور اضافه میشود, نتیجه :
خط 9:
دادن یک iterator ، یک طول و یک مقدار پیشفرض, دقت کنید که it هم اکنون به اول همان وکتور اولی اشاره میکند (یعنی اولین 100) چرا ؟ چون ما آن را مقدار دهی کردیم ولی بعد از اینکه محتویات وکتور را تغییر دادیم دوباره آن را مقدار دهی نکردیم, اما چون در خط 8 it را مساوی با مقدار بازگشتی متد insert گذاشتیم پس دوباره به اول همین وکتور اشاره میکند چرا ؟ چون متد insert یک اشاره گر به اولین داده ای که وارد وکتور میشود برمیگرداند که اینجا از قضا اولین داده ی وارد شده همان اولین داده ی داخل وکتورهست, پس :
خط 12:
تعریف یک وکتور دیگر به طول 2 و مقدار 400
🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
🔵 وکتور(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:
دادن یک iterator که به دومین موقعیت وکتور اشاره میکند و دوتا iterator که به اول و آخر یک وکتور دیگر اشاره میکند, پس :
خط 14:
تعریف یک آرایه و دادن مقادیری به آن
خط 15:
دادن یک iterator به اولین عنصر وکتور (متد begin() ) و دادن دو اشاره گر که یکی به اول و یکی به آخر آرایه اشاره میکند, در نتیجه:
🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
🔵 وکتور(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
این تابع یک متد برای حذف کردن هست, برای حذف ما دو روش داریم یکی اینکه میتوانیم داده های داخله وکتور را حذف کنیم یا یک بازه از داده ها را ، مثلا از عنصر 4 تا 12 یا عنصر 4 تا آخر وکتور
پارامتر ها :
🔹مفهوم Position:
یک const_iterator به عنصری که میخواهیم حذف شود
🔹مفهوم First,last:
این ها دو const_iterator هستند که به اول و آخر آن بازه ای از داده ها که قراره از وکتور حذف شوند
🔹مقادیر بازگشتی:
یک iterator به اولین عنصر است که بعد از عنصری که حذف میشود, فرض کنید عنصر 4 حذف شده پس این متد یک اشاره گر به عنصر 5 به ما می دهد ولی چون عنصر 4 حذف شده پس عنصر 5 به جای 4 می آید پس در واقع یک اشاره گر به عنصر 4 به ما می دهد
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)
🔹تابع 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
این متد که شاید یکی از هوشمندانه ترین تکتنیک های گرفتن حافظه است, البته این متد که هیچ حافظه ی تخصیص یا پس نمی دهد
ما اگر بخواهیم هر بار یک داده ی جدید را به وکتورمان اضافه کنیم باید یک بار یک تابع را برای گرفتن حافظه ی مورد نیازه آن داده فراخوانی کنیم که کلی زمان را از دست می دهیم پس می آییم برای یک بازه ی مشخص از عناصر یک جا حافظه میگریم البته این بازه دست ما نیست و خود کتابخانه مراحلش را انجام میدهد، ولی یک توضیح بهتون میدم ...
اول بازه ها رو بهتون میگم که چجوری هستش ...
اگر ما هیچ داده ای داخل وکتور نداشته باشیم مقدار حافظه ای که وکتور از سیستم می گیرد 0 هست اگه یک داده داشته باشیم بازم 1 هست اگه 2 تا داده باشیم بازم 2 هست اگه 3 تا داده داشته باشیم مقدارش میشه 4. بزارین ساده تر بگم مثلا برای تعداده داده هایی بین 16 تا 32 ما میاییم 32 تا حافظه میگیریم حتی اگه تعداد داده هامون 20 تا باشه یا مثلا اگه تعداد داده هامون 50 تا باشه وکتور میاد 64 تا حافظه میگیرد
فایدشم اینه که ما مجبور نیسیتیم برای هر داده ای که وارد وکتور می کنیم یک بار یه تابع را برای گرفتن حافظه صدا بزنیم پس با این روش سرعتمون بیشتر می شود ...
🔹مقادیر بازگشتی:
بازه ای که برایش حافظه گرفته شده را برمیگرداند
Output:
0
1
2
4
8
16
مقدار حافظه ای که وکتور می گیرد یک مسیر تصاعدی دارد
🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
🔵 وکتور(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
این متد کل محتویات وکتور رو پاک میکند
ما میتوانیم با یک روش دیگر هم کل عناصر وکتور رو پاک کنیم
به جای T نوع وکتور و به جای x اسم وکتور را قرار می دهیم
Output:
myvector contains: 100 200 300
myvector contains: 1101 2202
🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
🔵 وکتور(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
تعداد عناصری که داخل وکتور ذخیره شده را برمیگرداند, تعداد عناصر هیچ ربطی به نوع یا اندازه ی عناصر ندارد
🔹مقادیر بازگشتی :
تعداد عناصر ذخیره شده داخل وکتور
Output:
size: 0
size: 10
size: 20
size: 19
🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
🔵 وکتور(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
با این متد میتوانیم بازه ای از حافظه را که برای داده ها گرفته شده تغییر بدیم. برای اطلاعات بیشتر به capacity مراجعه شود. شما میتوانید این بازه را به هر اندازه ای که خواستید تغییر بدین حتی اگر این بازه جزء توان های 2 نباشد و در ضمن شما هیچ وقت نمیتوانید این بازه را بیشتر از max_size کنید و اگر تلاش کنید که همچین کاری انجام بدین این متد یک error را داخل کلاس length_error تنظیم میکند و صد البته نمیتوانید مقدار این بازه را از تعداد عناصر وکتور کمتر کنید و دو صد البته که نمیتوانید مقدار این بازه را از بازه ی فعلی هم کمتر کنید یعنی اگر مثلا تعداد عناصرمان 10 تا باشد، بازه ی حافظمان 16 تا می شود و ما نمیتوانیم این بازه را با تابع reserve از 16 تا کمتر کنیم
❌مفهوم length_error:
این کلاس نوعی از اشیا را که یک استثنا برای گزارش طول خطا پرتاب می کند تعریف می کند
🔹پارامتر ها :
🔻متغییر n
اندازه ی بازه ای که می خواهیم وکتور به آن تغییر اندازه دهد
Output:
100
همان طور که میدانید بازه ی استاندارد برای این وکتور 16 هست ولی ما آن را به 100 تغییر دادیم
🔰ترجمه شده از سایت www.cplusplus.com
@Learncpp
🔵 وکتور(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
این متد می تواند اندازه ی فعلی وکتور را عوض کند ما در تعریف وکتور با یک اورلود می توانستیم همزمان با تعریف وکتور اندازه ی آن را هم مشخص کنیم حالا با این تابع میتوانیم اندازه ی وکتور را عوض کنیم.
اگر اندازه ایی که می دهیم از اندازه ی فعلی خود وکتور کمتر باشد داده هایی که در قسمت آخر وکتور ذخیره شده اند را از بین می برد ولی اگه بیشتر باشد آن را با مقدار 0 پر می کند مگر اینکه مقدار val را به آن بدهیم, اگر val را مقدار دهی کنیم و n هم بزرگتر از اندازه ی فعلی خود وکتور باشد خانه های اضافی را با مقدار val پر می کند.
🔹پارامتر ها:
🔻متغییر n
این میزان اندازه ایی هست که قرار هست وکتور به این میزان تغییر اندازه دهد
🔻متغییر val
اگر n بزرگتر از اندازه ی فعلی خود وکتور باشد خانه های اضافی با این مقدار پر میشوند و اگر مقدار دهی نشوند خانه های اضافی با 0 پر می شوند
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)
🔹تابع 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
این متد تعداد بیشترین عناصری را که می توانیم داخل وکتور ذخیره کنیم را به ما می دهد، می دانید که وکتور هم یک حافظه ای دارد که ممکن است با پر شدنش تمام شود، حال اگر قرار باشد تعداد بیشتری عنصر را داخل وکتور ذخیره کنید می توانید یک کلاس تعریف کنید و به گونه ای تنظیم شود که تا زمانی که اولی پر نشده هیچ عنصری داخل وکتور دوم نرود و به همین ترتیب برای دیگر وکتورها هم همینطور عمل کنید
🔹مقادیر بازگشتی :
بیشترین تعداد عناصری که می توانیم در وکتور ذخیره کنیم
Output :
1073741823
مثال)
این هم برای ذخیره ی عناصر بیشتر از ظرفیت وکتور, اگر به تعداد بیشتری لازم دارید می توانید وکتورهای بیشتری داخل کلاس تعریف کنید و داخل انها هم داده ذخیره کنید
شعری هست که میگوید تا وکتور اول پر نشده است عناصر رو داخل وکتور اول ذخیره کن اگر اولی پر شد در دومی ذخیره کن اگر دومی پر شد در سومی ذخیره کن نشانه ی پر شدن وکتور هم این است که size( ) با max_size( ) برابر می شود
🔰ترجمه شده ازسایت www.cplusplus.com
@learncpp
🔵وکتور(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
این متد در عمل کاملا مثل عملگر [ ] عمل می کند با این تفاوت که اگر آن اندیسی که ما به این متد می دهیم نا معتبر باشد (برابر یا مساوی با size( ) یا کمتر از 0 به قول سایت سی پلاس یک استثناء پرتاب می کند که می توانیم با ساختار try،{ }catch( ){ } آن را چک کنیم
🔹پارامتر ها:
🔻مفهوم n:
اندیسی برای موقعیت عنصری که می خواهیم به آن دسترسی پیدا کنیم
Output:
myvector contains: 0 1 2 3 4 5 6 7 8 9
مثال)
Output:
Vector::_M_range_check
اگر اندیسی که می دهیم خارج از محدوده باشد اینگونه می شود ...
🔰ترجمه شده از سایت www.cplusplus.com
@learncpp
🔵وکتور(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[ ]
عملگر [ ] مثل اندیس داخل آرایه ها عمل می کند و همین عملگر باعث شباهت وکتور و آرایه هاست. ما به دو روش می توانیم از اندیس برای دسترسی به عناصر وکتور استفاده کنیم اولی که همان روش معمولی آرایه هاست :
و روش دیگر هم استفاده از متد operator[ ]( ) است :
این دو روش هیچ تفاوتی ندارند.
عملکرد این عملگر با متد at کاملا مشابه است ولی اگر ما یک مقداری که در محدوده ی وکتور نیست (مثلا منفی است، سه یا یک مقداری بیشتر از تعداد عناصر داخل وکتور ) به متد at بدهیم این متد یک خطای out_of_range را ست می کند ولی عملگر [ ] مقدار 0 را به ما می دهد.
🔹پارامتر ها:
🔻مفهوم N:
موقعیت یا اندیس عنصر داخل وکتور که البته از 0 شروع می شود نه از 1
Output:
0 1 2 3 4 5 6 7 8 9 10
34
همان طور که می بینید با این عملگر می توانیم هم مقداری را بخوانیم هم مقداری را تغییر بدهیم، کاملا شبیه آرایه ها.
🔰ترجمه شده ازسایت www.cplusplus.com
@learncpp
🔵وکتور(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
به طور کاملا ساده ای چک می کند که آیا وکتور ما خالی است یا نه، خالی بودن به این معنی است که size( ) مقدارش 0 باشد.
🔹مقادیر بازگشتی :
اگر true باشد وکتور ما خالی است در غیر اینصورت اگر false باشد یعنی حداقل یک عنصر داخل وکتور وجود دارد
مثال)
Output :
Total: 55
این برنامه یک وکتور را با یک دنباله از اعداد 1 تا 10 پر می کند بعد تا زمانی که خالی نشده یکی از آخر حذف می کند و یه متغیر را ++ می کند. وقتی که وکتور خالی شد از حلقه بیرون می آید و مقدار آن متغیر که حالا برابر با تعداد عناصر داخل وکتور است را چاپ میکند.
🔰ترجمه شده از سایت www.cplusplus.com
@learncpp
🔵وکتور(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:
شاید برای شما سوال پیش آمده باشد که چگونه می شود یک اشاره گر را طوری تعریف کرد که بتواند به جای خاص از یک وکتور اشاره کند اگر ما یک وکتور را به روش معمولی به صورت اشاره گر تعریف کنیم آن اشاره گر فقط می تواند به ابتدای وکتور اشاره کند ولی اگر به روش زیر عمل کنید می توانید به ابتدا و انتهای یک وکتور اشاره کنید :
حال a به صورت یک اشاره گر از نوع وکتور تعریف شده حال چگونه باید به انتهای وکتور اشاره کند؟ یک متد داخل وکتور هست که می تواند این کار را انجام دهد
حالا a به انتهای وکتور اشاره می کند.
حالا a به ابتدای وکتور اشاره می کند.
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵وکتور(vector)
🔹مفهومiterator:
شاید برای شما سوال پیش آمده باشد که چگونه می شود یک اشاره گر را طوری تعریف کرد که بتواند به جای خاص از یک وکتور اشاره کند اگر ما یک وکتور را به روش معمولی به صورت اشاره گر تعریف کنیم آن اشاره گر فقط می تواند به ابتدای وکتور اشاره کند ولی اگر به روش زیر عمل کنید می توانید به ابتدا و انتهای یک وکتور اشاره کنید :
Vector<int>::iterator a;حال a به صورت یک اشاره گر از نوع وکتور تعریف شده حال چگونه باید به انتهای وکتور اشاره کند؟ یک متد داخل وکتور هست که می تواند این کار را انجام دهد
a.end( );حالا a به انتهای وکتور اشاره می کند.
a.begin( );حالا a به ابتدای وکتور اشاره می کند.
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
#vector #Begin
🔵وکتور(vector)
🔹تابع Begin
و اما begin ... این یک اشاره گر بر می گرداند که به اولین عنصر وکتور اشاره میکند البته می دانید که منظورم از اشاره گر همان iterator است . begin و end مثل هم عمل می کنند با این تفاوت که begin به اول وکتور اشاره می کند و end به آخر وکتور البته همیشه آخرینه آخرین عنصری که برای ما هم بدون iterator ها قابل دسترسی نیست مقدار 0 یا همان NULL است که end به همین اشاره می کند بروید end را بخوانید
🔹مقادیر بازگشتی :
اگر داده ای داخل وکتور وجود داشته باشد یک اشاره گر به اولین داده داخل وکتور برمی گرداند اگر داده ای هم نباشد begin به چیزی اشاره نمیکند پس begin چیزی را برنمی گرداند.
Output :
1
1
در این مثال می بینید که با iterator ها می شود مثل اشاره گر ها رفتار کرد یعنی با عملگر * می توانیم مقدار آنها را بخوانیم در این مثال دو نوع استفاده از iterator ها گفته شده است یک بار اولین عنصر وکتور را مستقیم با عملگر * می خوانیم و چاپ می کنیم یک بار هم iterator ی که به اولین عنصر اشاره می کند را می ریزیم در یک iterator دیگر بعد با * چاپش می کنیم
🔰ترجمه شده ازسایت
www.cplusplus.com
@Learncpp
🔵وکتور(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 به اولین عنصر وکتور بر می گرداند، تفاوتش با begin این است که شما با begin می توانید مقدار اولین عنصر وکتور را عوض کنید مثل این :
ولی با cbegin نمی توانید این کار را کنید و برای زمانهایی خوب است که شما می خواهید فقط به اولین عنصر وکتور دسترسی داشته باشید و مطمئن هم باشید که هیچ موقع مقدار تغییر نمی کند چون اگر از begin استفاده کنید ممکن است جایی از برنامه به طور کاملا ناخواسته و اشتباها مقدارش عوض شود.
🔹مقادیر بازگشتی :
یک const_iterator به اولین عنصر وکتور اشاره می کند و اگر وکتور خالی باشد به چیزی اشاره نمی کند.
Output:
myvector contains: 10 20 30 40 50
همانطور که می بینید با cbegin می توانیم مطمئن باشیم که به اولین عنصر به طور فقط_خواندنی دسترسی داریم.
🔰ترجمه شده ازسایت
www.cplucpluc.com
@Learncpp
🔵وکتور(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
تابع rbegin می تواند جایگزین مناسبی برای end باشد. rbegin همه چیز را داخل وکتور برعکس می بیند حتی ترتیب عناصر، پس با این حساب اولین عنصر را هم آخرین عنصر می بیند پس یک اشاره گر به آخرین عنصر وکتور برمی گرداند. دقت کنیم که یک اشاره گر به آخرین عنصر بر می گرداند نه به آخرینه آخرین عنصر پس می توانیم جای تابع end از آن استفاده کنیم و دیگر مجبور نباشیم آخرین عنصر را با * یا end بخوانیم.
🔹مقادیر بازگشتی :
یک reverse_iterator به آخرین عنصر وکتور بر میگرداند
Output :
3
برعکس اسمی که دارد عمل می کند.
🔰ترجمه شده از سایت
www.cplusplus.com
@Learncpp
🔵وکتور(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