স্ট্যান্ডার্ড :: রাইজাইয়েড (এন) এবং স্টাড :: সি ++ এ সংকোচ_ টুফিটের মধ্যে পার্থক্য?


11

আমি এই বিবৃতিগুলি জুড়ে এসেছি:

resize(n)- ধারকটিকে পুনরায় আকার দিন যাতে এতে 'এন' উপাদান থাকে।
shrink_to_fit()- ধারকের আকারের সাথে ফিট করার ক্ষমতা হ্রাস করে এবং ক্ষমতা ছাড়িয়ে সমস্ত উপাদান ধ্বংস করে।

এই ফাংশনগুলির মধ্যে কোনও উল্লেখযোগ্য পার্থক্য রয়েছে কি? তারা সি ++ তে ভেক্টরের অধীনে আসে


আকার বদলে কনটেইনার আকার পরিবর্তন করে, সঙ্কুচিত_পৃষ্ঠা_ফিট দেয় না। সাধারণ ব্যবহারের জন্য আপনাকে সঙ্কুচিত_ টুফিট সম্পর্কে জানতে হবে না, এটি কেবল বিকাশকারীদের তাদের কোডের কার্য সম্পাদন ম্যানুয়ালি বাড়িয়ে তুলতে সক্ষম।
NoSenseEtAl

2
স্ট্যান্ডার্ড পাত্রে একটি আকার এবং ক্ষমতা রয়েছে । আকারটি ধারকটিতে থাকা উপাদানগুলির বর্তমান সংখ্যা, যখন ক্ষমতাটি বরাদ্দকৃত মেমরির পরিমাণ (মোটামুটিভাবে)। আকার পরিবর্তন করে আকার shrink_to_fitপরিবর্তন করে, ক্ষমতা পরিবর্তন করে।
কিছু প্রোগ্রামার ড্যুড

2
আপনি মধ্যে পার্থক্য বুঝতে না capacityএবং size?
কিউবিক

উত্তর:


12

ভেক্টরগুলির দুটি "দৈর্ঘ্য" বৈশিষ্ট্য রয়েছে যার অর্থ বিভিন্ন জিনিস:

  • sizeভেক্টরটিতে ব্যবহারযোগ্য উপাদানগুলির সংখ্যা। এটি আপনার সঞ্চিত জিনিসগুলির সংখ্যা। এটি একটি ধারণাগত দৈর্ঘ্য।
  • capacity ভেক্টর বর্তমানে যে পরিমাণ মেমরি বরাদ্দ করেছে তাতে কতগুলি উপাদান মাপসই হয়।

capacity >= sizeঅবশ্যই সর্বদা সত্য হতে হবে, তবে তাদের সর্বদা সমান হওয়ার কোনও কারণ নেই। উদাহরণস্বরূপ, আপনি যখন কোনও উপাদান অপসারণ করবেন, বরাদ্দ সঙ্কুচিত করার জন্য একটি নতুন বরাদ্দ একটি ছোট বালতি তৈরি করা উচিত এবং বাকী বিষয়বস্তু ("বরাদ্দ করুন, সরান, বিনামূল্যে") এর উপরে সরিয়ে নেওয়া দরকার।

একইভাবে, capacity == sizeএবং যদি আপনি একটি উপাদান যোগ করেন তবে ভেক্টর একটি উপাদান দ্বারা বরাদ্দ বাড়িয়ে তুলতে পারে (অন্য "বরাদ্দ, সরান, বিনামূল্যে" অপারেশন), তবে সাধারণত আপনি একাধিক উপাদান যুক্ত করতে চলেছেন। ধারণক্ষমতা চাহিদা বৃদ্ধি পারেন, ভেক্টর তার ধারণক্ষমতা বৃদ্ধি হবে বেশি এক উপাদান যাতে আপনি সবকিছু আবার সরাতে প্রয়োজন সামনে আরো কয়েকটি উপাদান যুক্ত করতে পারেন।

এই জ্ঞান দিয়ে, আমরা আপনার প্রশ্নের উত্তর দিতে পারি:

  • std::vector<T>::resize()অ্যারের আকার পরিবর্তন করে । আপনি যদি এটির বর্তমান আকারের চেয়ে ছোট আকার পরিবর্তন করেন তবে অতিরিক্ত জিনিসগুলি ধ্বংস হয়ে যায়। আপনি যদি এটির বর্তমান আকারের চেয়ে বড় আকার পরিবর্তন করেন তবে শেষে যুক্ত হওয়া "নতুন" অবজেক্টগুলি ডিফল্ট-আরম্ভ করা হয়।
  • std::vector<T>::shrink_to_fit()বর্তমান আকারের সাথে মেলে সামর্থ্যের পরিবর্তন করতে বলে asks (প্রয়োগগুলি এই অনুরোধটিকে সম্মান জানাতে পারে বা নাও পারে । তারা সক্ষমতা হ্রাস করতে পারে তবে এটি আকারের সমান করে না। তারা কিছু করতে পারে না)) অনুরোধটি পূরণ হলে এটি কিছু বা সমস্ত অব্যবহৃত অংশ বাতিল করে দেবে) ভেক্টর বরাদ্দ। আপনি যখন ভেক্টর তৈরির কাজ শেষ করেন আপনি সাধারণত এটি ব্যবহার করবেন এবং এটিতে আর কোনও আইটেম যুক্ত করবেন না। (আপনি যদি কয়টি আইটেম যুক্ত করবেন তা std::vector<T>::reserve()আগেই জানা থাকে যে কোনও shrink_to_fitকিছু করার উপর নির্ভর না করে কোনও আইটেম যুক্ত করার আগে ভেক্টরকে বলাই ভাল ))

সুতরাং আপনি ভেক্টরে ধারণামূলকভাবে কতগুলি জিনিস রয়েছে তাresize() পরিবর্তন করতে আপনি ব্যবহার করেন।

shrink_to_fit()ভেক্টরটি ভেক্টরটিতে ধারণামূলকভাবে কতটা স্টাফ রয়েছে তা পরিবর্তন না করে আপনি অভ্যন্তরীণভাবে ভেক্টর যে অতিরিক্ত জায়গা বরাদ্দ করেছেন তা হ্রাস করতে আপনি ব্যবহার করেন।


2
নোট করুন যে shrink_to_fitসমস্ত বা কিছুই নয়। একটি বাস্তবায়ন ক্ষমতা পার্ট ওয়ে কমাতে পারে। উদাহরণস্বরূপ এমন একটি বাস্তবায়ন বিবেচনা করুন যা ভেক্টরের সক্ষমতাটিকে দু'জনের ক্ষমতাকে সীমাবদ্ধ করে।
ফ্রান্সোইস অ্যান্ড্রিউস

5

shrink_to_fit() - ধারকের আকারের সাথে ফিট করার ক্ষমতা হ্রাস করে এবং ক্ষমতা ছাড়িয়ে সমস্ত উপাদান ধ্বংস করে।

যা ঘটে থাকে তার একটি ভুল ব্যাখ্যা is গোপনীয়ভাবে, ক্ষমতা অংশের বাইরে সমস্ত উপাদান ধ্বংস করে সঠিক নয় not

সি ++ এ যখন বস্তুর জন্য গতিশীল মেমরি ব্যবহৃত হয় তখন দুটি ধাপ থাকে:

  1. বস্তুগুলির জন্য স্মৃতি বরাদ্দ করা হয়।
  2. বস্তুগুলি মেমরির স্থানে প্রাথমিক / নির্মিত হয়।

যখন গতিশীল বরাদ্দ মেমরির বস্তুগুলি মুছে ফেলা হয়, তখন দুটি পদক্ষেপও থাকে, যা নির্মাণের ধাপগুলি আয়না করে কিন্তু বিপরীত ক্রমে:

  1. ধ্বংস হওয়া মেমরির অবস্থানগুলিতে অবজেক্টগুলি (অন্তর্নির্মিত ধরণের জন্য, এটি একটি নূপুর)।
  2. অবজেক্টস দ্বারা ব্যবহৃত স্মৃতি বিলোপযুক্ত।

ধারকটির আকারের বাইরে বরাদ্দ করা মেমরিটি কেবল বাফার। তারা কোনও সঠিকভাবে আরম্ভ করা অবজেক্ট ধরে না। এটি কেবল কাঁচা স্মৃতি। shrink_to_fit()অতিরিক্ত মেমরি না থাকলেও সেই জায়গাগুলিতে কোনও বস্তু ছিল না তা নিশ্চিত করে। অতএব, কিছুই ধ্বংস হয় না, কেবল স্মৃতি ক্ষয় হয়।


2

সি ++ স্ট্যান্ডার্ড অনুসারে shrink_to_fit

প্রভাবগুলি: সঙ্কুচিত_ টুফিটটি () আকার () এর ক্ষমতাকে হ্রাস করার জন্য একটি অ-বাধ্যবাধকতা অনুরোধ।

এবং সম্পর্কিত resize

প্রভাবসমূহ: যদি sz <আকার (), সিকোয়েন্স থেকে শেষ আকার () - sz উপাদানগুলি মুছে দেয়। অন্যথায়, সেকেন্ডে sz - আকার () ডিফল্ট-সন্নিবেশ করা উপাদানগুলি সংযোজন করে।

এটি স্পষ্ট যে ফাংশনগুলি বিভিন্ন জিনিস করে। তবুও প্রথম ফাংশনের কোনও প্যারামিটার নেই যখন দ্বিতীয় ফাংশনে এমনকি দুটি পরামিতি রয়েছে। ফাংশনটি shrink_to_fitধারকটির আকার পরিবর্তন করে না যদিও মেমরিটি পুনরায় প্রকাশ করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.