آموزش وکتور در سی پلاس پلاس

آموزش استفاده از وکتور (vector) در زبان ++C

وکتور – vector یکی از کلاس های خیلی خوب سی پلاس پلاس است که استفاده از آن نوشتن خیلی از برنامه ها را آسان می کند . این ساختمان داده، تا حدودی مانند آرایه است با این تفاوت که می شود حین برنامه به صورت پویا به عناصر آن اضافه و یا از آن ها کم کرد و مدیریت طول آن را به خود شئ سپرد. هم چنین متد های زیادی دارد که باعث می شود وقتمان را برای نوشتن متد برای کار با آریه های با طول ثابت معمولی، هدر ندهیم .

به جای لیست پیوندی در خیلی از جاها می شود از وکتور هم استفاده کرد و از درد سرهای لیست پیوندی کاست. برای دیدن آموزش لیست پیوندی اینجا کلیک کنید.

هدر کتابخانه vector

برای استفاده از وکتور باید هدر آن  را پیوست برنامه کرد :

تعریف شئ vector

فرض کنید می خواهیم وکتوری به اسم test شامل ۱۰ خانه از نوع int تعریف کنیم که مقدار اولیه همه خانه ها ۰ است:

الان وکتوری با ۱۰ خانه با مقدار های ۰ داریم البته دقت کنید اینجا هم مانند آرایه شماره گذاریش از صفر شروع می شود برای دسترسی به خانه های آن از دو روش  استفاده می شود.

دسترسی به عناصر یک vector

۱-روش عادی مانند آرایه:

۲-با استفاده از تابع عضو ()at :

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

در بالا از سایز اسم بردم پس بگذارید شما را با دو اصطلاح آشنا کنم :

اندازه یک شئ vector

سایز  (size) : سایز همان تعداد خانه هایی است  که ما در آن ها مقدار داریم. در وکتوری که بالاتر ما ایجاد کردیم سایز ۱۰ است (که در ابتدای تعریف همه با صفر پر شده اند). برای دریافت مقدار سایز تابع عضو (متد) size را داریم که استفاده از آن به این شکل است :

حالا اگه آن را در دستور خروجی قرار بدهیم مقدار ۱۰ را نشان می دهد:

ظرفیت یک شئ وکتور vector

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

اگر آن را در خروجی چاپ کنیم مقدار ۱۲ را بر می گرداند که دوتا از سایز  بزرگ تر است یک سوال پیش می آید با خود می گوییم اگر دو مقدار جدید دیگر اضافه کردیم و ظرفیت پر شد چه می شود؟ جواب ساده است آنگاه خود شئ، دوباره ظرفیت را زیاد می کند (هر دفعه دو برابر قبل).

بیشترین طول ممکن برای یک شئ vector

حالا نوبتی هم باشد، نوبت ()max_size این تابع عضو بیشرین طول ممکن برای ایجاد یک وکتور را می گوید که اندازه آن به مشخصات سیستم مربوط می شود:

تغییر اندازه یک vector

حالا به سراغ تابع عضو ()resize می رویم که یکی از توابع بسیار کاربردی است. فرض کنید در وکتور test با سایز ۱۰ ما ۴ خانه آخر را نخواهیم یا ۴ خانه کم  داشته باشیم و بخواهیم اضافه کنیم :

در دستور اول سایز را به ۶ کاهش دادیم و در دستور بعدی سایز به ۱۴ تا افزایش داده شده است.

 

دو تابع عضو دیگر هم به اسم push_back و pop_back را هم داریم که کار اضافه کردن و کم کردن مقدار جدید به آخر وکتور را دارند:

اضافه کردن به انتهای vector

۱-تابع عضو push_back:

با دستور بالا یک خانه به آخر وکتور با مقدار ۸ اضافه می شود و به سایز هم یکی اضافه می شود.

 

برداشتن آخرین عنصر داخل vector

۲-تابه عضو ()pop_back :

با این دستور خانه آخر وکتور از بین می رود و از سایز هم یکی کم می شود.

 

دیدن مقدار اولین و آخرین عنصر داخل vector

تابع های عضو ()back و ()front هم خانه های آخر و اول وکتور را تعیین می کنند:

دو دستور بالا با هم برابرند و هر مقدار عنصر سر وکتور را نشان می دهد.

پاک کردن تمام مقادیر داخل vector

برای نابود کردن یک وکتور هم  از تابع عضو ()clear استفاده می کنیم:

در زیر هم یک کد کامل از تمام چیز هایی که گفته شد آمده است.

مثالی از قابلیت های وکتور vector در سی پلاس پلاس:

 

۳۲ نظر

  • سلام ،میخواستم بدونم توی وکتور مثلا دستوری هست که لیست ایجادی وکتور رو inverse کنه یعنی:١٢٣۴ رو بکنه ۴٣٢١

    • حامد آهنگری

      سلام
      برای این کار یک تابع داخل کتابخانه algorithm به نام reverse وجود داره که هم روی vector کار می کنه و هم روی آرایه های معمولی.
      اول کتابخانه algorithm رو اضافه (اینکلود) کنید و بعد برای استفاده از تابع reverse ابتدا و انتهای وکتور رو به عنوان آرگومان بهش پاس بدید. مثال:

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

    • فرهاد دلیرانی

      سلام نه مگر اینکه اون کلاس ها توی ارث بری یک پدر مشترک داشته باشند. به مطالب آموزشی با عنوان “چند ریختی در سی پلاس پلاس” سر بزنید.

  • کوتاه مختصر مفید
    سپاس گذارم

  • مطالبتون عالیه

  • مطالب عالی بود خیلی خیلی ممنون

  • خیلی ممنون . بسیار مفید بود

  • سلام
    بابت مطالب مفید سایتتون بسیار متشکرم.
    هر بار که مطلبی رو متوجه نشم به سایت شما سر میزنم وقتی ببینم اون مطلبو داره مطمئن میشم که یادش میگیرم. واقعا که عالیه

  • سلام تو codeblocks

    size و capacity رو هم اندازه میگیره. یعنی اگه سایز رو ده نشون بده دیگه capacity دوازده نشون نمیده.چرا؟

    • فرهاد دلیرانی

      این کد را اجرا کنید – خواهید دید که الزاما برابر نیستند.

      برای مطالعه ی بیشتر به آدرس زیر بروید:

      http://stackoverflow.com/questions/6296945/size-vs-capacity-of-a-vector

  • برای این که بخواهیم وکتور ما شامل چند تا داده باشه چی ؟
    مثلا یه دونه اینتیجر و یه دونه استرینگ

    • فرهاد دلیرانی

      یک Data type انتزاعی جدید با اسفاده از class یا struct می سازید که شامل هم رشته و هم عدد صحیح باشد و شئ vector را از جنس اون Data type تعریف و ایجاد می کنید!

  • در خط ۳۲ ، ex چیه؟

  • سلام
    من باید برنامه درخت متوازن رو بنویسم مربوط به درس ذخیرست
    میخوام توی نود هام به جای یک فیلد چند فیلد بذارم میشه بګید باید چیکار کنم؟

    • فرهاد دلیرانی

      منظورتون رو دقیق نفهمیدم، یک کلاس جدید تعریف کن که شامل چند فیلد باشد و آن کلاس را درون وکتور بریزید.

  • مهمترین دستور قسمت insert رو توضیح ندادید!

  • سلام
    آیا تابعی وجود داره که یه وکتور از وکتور هایی بسازه که سایزشون یکی نیست؟

  • یه سوال داشتم.استادمون یه پروژه دادن با این موضوع که کوتاهترین مسیر(منظورم کمترین هزینه س ) بین دو شهر رو پیدا کنید.گفتن برای پیاده سازی گراف ها از لینک لیست استفاده کنید.الان اگر من به جای لینک لیست از وکتور استفاده کنم ایشون میتونن از نمره پروژم کم کنن ؟
    میخواستم بدونم میزان مصرف حافظه برای چنین پروژه ای چقدره؟(با استفاده از الگوریتم دایچسترا نوشته شده) ممنون میشم کمکم کنید.

    • فرهاد دلیرانی

      بعید می دونم مشکللی باشه ولی باز از استاد بپرسید در مورد هزینه الگوریتم چیزی نمی تونم بگم باید ببینم و به پیاده سازی هم مربوط است

  • سلام یه سوال شما میتونید درباره ی این برنامه راهنمایی کنید؟؟؟با (وکتور میخواهم قسمت جستجو رو بروم)
    برنامه ای بنویسید که اطلاعات دانشجویان را دریافت وذخیره وبازیابی وجستجو کند /

    • فرهاد دلیرانی

      خوب اول یک کلاس درست می کنید برای دانشجو ها که اطلاعاتی مثل شماره دانشجویی و اسم و… در آن است، بعد یه ویکتور از جنس اون کلاس درست می کنی و بعد اطلاعاتتو با دستور پوش که در متن آمده در وکتور می ریزی برای جستجو هم از خانه صفر وکاور شروع می کنی به مقایسه تا خونه آخر که همان سایز منهای یک است. موبد باشید. 🙂

  • سلام/خیلی سایت خوبی بود /درباره جستجو در وکتور میخواستم بیشتر بدونم؟؟؟؟؟؟؟؟؟؟

    • فرهاد دلیرانی

      سلام، می توانید به سایت
      Cplusplus.com
      برید و کتابخانه vector. با همه ی متد هاشو ببینید

  • با سلام و خسته نباشی
    مطالب بسیار مفیدی بود
    میتونید یک مرجع نمونه سوال در مورد مبحث چند ریختی ، وراثت ، کلاسها ،تابعهای بازگشتی، رشته ها و اشاره گرها با زبان c++ بهم معرفی کنید.
    با تشکر

    • فرهاد دلیرانی

      با سلام ، می تونید از تمرین ها و مثال های آخر فصل کتاب “چگونه با سی پلاس پلاس برنامه بنویسیم؟” اثر دیتل استفاده کنید.

  • سلام.پستتون خیلی به دردم خورد.ممنون.
    یه سوال داشتم شما تا حالا با Qtکار کردید؟چند تا سوال می خواستم بپرسم.اگه خودتون کار نکردید،میتونید کسی رو بهم معرفی کنید که کار کرده باشه و ایمیلش رو بهم بدید تا چند تا سوال بپرسم.اگه میشه از طریق ایمیلم بهم خبر بدید[email protected]};-

    • فرهاد دلیرانی

      سلام من خودم کار نکردم ولی یک ایمیل برای شما فرستادم که حاوی ایمیل فردی است که بلد است.

  • سلام ; تشکر از مطالب خوبتان کمتر سایتی دیدم که به این تر و تمیزی پست بذاره حیف که تعداد محدودی پست در هفته می گذارید .

نظرتان را برای ما بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *