কনস্ট্রাক্টর এবং ডেস্ট্রাক্টরকে কল করার সম্ভাব্য প্রয়োজনের কারণে সি ++ এ পুনরায় আকার দেওয়া বিশ্রী।
আমি মনে করি না যে সি ++ তে আপনার resize[]
সাথে কোনও অপারেটর থাকতে পারে না new[]
এবং delete[]
এটি এর অনুরূপ কিছু করেছিল:
newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;
স্পষ্টতই oldsize
কোনও গোপন অবস্থান থেকে পুনরুদ্ধার করা হবে, এটি একই সাথে রয়েছে delete[]
এবং Type
এটি অপারেন্ডের ধরণ থেকে আসে। resize[]
প্রকারটি অনুলিপিযোগ্য নয় যেখানে ব্যর্থ হবে - যা সঠিক, কারণ এই জাতীয় বস্তুগুলি সহজেই স্থানান্তরিত করা যায় না। শেষ অবধি, উপরের কোডটি ডিফল্টরূপে বস্তুগুলিকে নির্ধারিত করার পূর্বে তৈরি করে, যা আপনি প্রকৃত আচরণ হিসাবে চান না।
একটি সম্ভাব্য অপ্টিমাইজেশন রয়েছে যেখানে newsize <= oldsize
, সদ্য-প্রত্যয়যুক্ত অ্যারেগুলির "শেষের অতীত" অবজেক্টগুলির জন্য ডেস্ট্রাক্টরদের কল করতে এবং অন্য কিছু না করে। মানটিকে এই অপ্টিমাইজেশনটি প্রয়োজনীয় (কিনা আপনি যখন resize()
ভেক্টর হিসাবে) প্রয়োজন, অনুমোদিত তবে অনির্ধারিত, অনুমতিপ্রাপ্ত তবে বাস্তবায়ন-নির্ভর, বা নিষিদ্ধ কিনা তা নির্ধারণ করতে হবে ।
তারপরে আপনার নিজের জিজ্ঞাসা করা প্রশ্নটি হ'ল, "এটি প্রদানের ক্ষেত্রে এটি কি আসলেই কার্যকর হয় vector
এবং এটি একটি পুনরায় আকার-সক্ষম পাত্র সরবরাহের জন্য বিশেষভাবে ডিজাইন করা হয়েছে (স্বতন্ত্র স্মৃতিতে - সেই প্রয়োজনটি C ++ 98 এ বাদ দেওয়া হয় তবে C ++ 03 এ সংশোধন করা হয়েছে) এটি কাজ করার সি ++ পদ্ধতির সাথে অ্যারে তুলনায় আরও ভাল ফিট? "
আমি মনে করি উত্তরটি ব্যাপকভাবে "না" বলে মনে করা হচ্ছে। আপনি যদি সি পদ্ধতিতে পুনরায় আকারে পরিবর্তনযোগ্য বাফার করতে চান তবে ব্যবহার করুন malloc / free / realloc
, যা সি ++ এ উপলব্ধ। আপনি যদি সি ++ উপায়ে আকার পরিবর্তনযোগ্য বাফার করতে চান deque
, তবে একটি ভেক্টর ব্যবহার করুন (বা , যদি আপনার আসলে স্ট্যাটাসের প্রয়োজন না হয়)। new[]
কাঁচা বাফার ব্যবহার করে দুজনকে মিশ্রিত করার চেষ্টা করবেন না , যদি না আপনি ভেক্টরের মতো ধারক ব্যবহার করছেন implementing