PDA

View Full Version : سوال: Microsoft Visual c++ Runtime Library



sourcecode
چهارشنبه 16 مهر 1393, 15:47 عصر
من یک بردار(وکتور) از نوع int ایجاد کردم بدون مقدار اولیه .

Vector <int> a;



با دستور Reserve اندازه بردار رو زیاد میکنم .

a.Reserve(10);



حال به اولین خانه مقدار میدم

a[0]=1;



و سپس برنامه را اجرا کنیم که خطای زیر ظاهر میشود .


124349



سوال من اینه که :

کد زیر را در نظر بگیرید .

Vector <int> a;
a.reserve(10);
a[0]=1;


به محض اجرا خطایی مانند تصویر بالا نمایش داده میشه . حال اگه کد را به شکل زیر تغییر دهیم مشکل برطرف میشه .

Vector <int> a(1);
a.reserve(10);
a[0]=1;



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





a[1]=2;





در صورتی که من فضایی به طول 10 خانه ایجاد کردم پس چرا برنامه خطا می گیره . وظیفه دستور Reserve چیه .


یا من برداری مانند زیر ایجاد کنم .



Vector <int> a(5);

حال اگه در حین اجرا برنامه به ظرفیت بیشتر از 5 لازم داشته باشم با کمک دستور Reserve مقدارش را زیاد می کنم .

a.Reserve(10);

حال اگه کد زیر رو استفاده کنم کامپایلر اررور میده

a[8]=8;

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

rahnema1
چهارشنبه 16 مهر 1393, 20:30 عصر
وقتی شما توسط سازنده با یک مقدار مثل 5 وکتور ایجاد می کنید. یک وکتور با 5 عضو ایجاد میشه و تمام اونها مقدار صفر می گیرند
اما وقتی شما مثلا یک بردار ایجاد می کنید و سپس reserve با مقدار 10 می دهید در واقع این وکتور هیچ عضوی برایش ایجاد نمیشه. تابع reserve فقط موجب میشه فضا برای وکتور اختصاص داده بشه اما هیچ عضوی برای اون ایجاد نشه یعنی reserve(10 باعث میشه اگه بعدا مقداری به وکتور وارد کردید دیگه لازم نباشه حافظه به اون اختصاص داده بشه
حالا اگه می خواهید یک عضو به وکتور اضافه کنید با تابع push_back یا مثلا insert میتونید اضافه کنید
حالا اگه reserve به اندازه 10 تا کرده باشید و با push_back ده تا عضو به وکتور اضافه کردید ، هیچ فضایی لازم نیست اختصاص داده بشه ( چون قبلا رزرو شده) اما عنصر یازدهم که خواست push_back بشه یک خانه فضا اختصاص داده میشه و مقدار مورد نظر در اون خانه قرار می گیره