স্টাড :: ভেক্টরের প্রাথমিক আকার কীভাবে সেট করবেন?


130

আমার একটি রয়েছে vector<CustomClass*>এবং আমি ভেক্টরে প্রচুর আইটেম রেখেছি এবং আমার দ্রুত অ্যাক্সেসের প্রয়োজন, তাই আমি তালিকাটি ব্যবহার করি না। ভেক্টরের প্রাথমিক আকার কীভাবে সেট করবেন (উদাহরণস্বরূপ 20 000 জায়গা হতে পারে, তাই আমি নতুন sertোকানোর সময় অনুলিপিটি এড়ানোর জন্য)?


1
কোনও প্রয়োজনে এর জন্য একজন কনস্ট্রাক্টর এবং দুটি ফাংশন রয়েছে std::vectorযা আপনার প্রয়োজনের সাথে আরও ভাল ফিট করে।
ক্রিস

1
আপনি কেবল প্রাথমিক মান নির্ধারণ করা অনুলিপি করতে পারবেন না setting
janchopanza

1
অনুলিপি এড়ানো? পয়েন্টারগুলি সংরক্ষণ করার জন্য অনুলিপি করার ব্যয়ের দিক থেকে বেশ হালকা।
ব্যবহারকারী 7116


1
@ দামির, আপনি কি std::vectorশিরোনাম বলতে চাইছেন ?
রোব

উত্তর:


180
std::vector<CustomClass *> whatever(20000);

বা:

std::vector<CustomClass *> whatever;
whatever.reserve(20000);

প্রাক্তন অ্যারের প্রকৃত আকার নির্ধারণ করে - যেমন এটি 20000 পয়েন্টারের ভেক্টর তৈরি করে। পরেরটি ভেক্টরটিকে খালি ছেড়ে দেয়, তবে 20000 পয়েন্টারগুলির জন্য স্থান সংরক্ষণ করে, যাতে আপনি এটি পুনরায় প্রত্যাহার না করেই অনেকগুলি সন্নিবেশ করতে পারেন (অবধি)।

কমপক্ষে আমার অভিজ্ঞতা হিসাবে, এগুলির উভয়ের পক্ষে পারফরম্যান্সে বিশাল পার্থক্য করা মোটামুটি অস্বাভাবিক - তবে হয় কিছু পরিস্থিতিতে নির্ভুলতা প্রভাবিত করতে পারে। বিশেষত, যতক্ষণ না কোনও পুনরায় স্থান গ্রহণ না করা হয়, ততক্ষণ পর্যন্ত ভেক্টরটিতে পুনরাবৃত্তিকারীদের বৈধ থাকার গ্যারান্টি দেওয়া হয়, এবং একবার আপনি আকার / সংরক্ষিত স্থান নির্ধারণ করে দিলে, আপনি গ্যারান্টিযুক্ত আছেন যে আপনি যতক্ষণ না ডোন ততক্ষণ কোনও পুনঃনির্ধারণ হবে না ' t এর বাইরে আকার বাড়ান।


এর মধ্যে কোনটি বৃহত সংখ্যক সন্নিবেশ / মুছে ফেলার জন্য আরও কার্যকর হবে?
ctor

3
@ লোগি: আমি সন্দেহ করি দক্ষতার মধ্যে কোনও পার্থক্য থাকবে। বেশিরভাগ ক্ষেত্রে এটি আপনি কীভাবে ব্যবহার করবেন তা পরিবর্তিত করে - প্রাক্তনটির সাথে আপনি কেবল পয়েন্টারগুলিকে সম্বোধন করেন, তবে এমন whatever[10000] = somepointer;কোনও কিছু যেখানে push_backআপনার যুক্ত প্রতিটি পয়েন্টারের সাথে আপনার পরবর্তী প্রয়োজন you কমপক্ষে আপনি যদি অভ্যস্ত হন vectorতবে সম্ভবত এটি সম্ভবত সহজ এবং আরও প্রাকৃতিক।
জেরি কফিন

যদি ধারকটি অনুলিপি করা হচ্ছে তার আকারটি যদি জানা থাকে তবে কেন এটি পুনরায় আকারের (রি) আকারে আরও কার্যকর এবং তারপরে পুশিং-ব্যাকের পরিবর্তে অনুলিপি করা যায় না?

1
@ সিনসিনিটাস: কারণ এটির একটি কল রয়েছে reserveযা মেমরির আকারটিকে পূর্ব-বরাদ্দ করে। তত্ত্ব অনুসারে, আকার নির্ধারণ করা এখনও কয়েক মিনিট দ্রুত হতে পারে, কারণ আপনি যখনই কোনও আইটেম যুক্ত করেন তখন এটি বর্তমান আকারটিকে বাড়ানো এড়াতেও এড়াতে পারে। বাস্তবে, আমি সন্দেহ করি যে আপনি এটি পরিমাপ করতে পারেন।
জেরি কফিন

1
আসলে, আপনি যদি কোনও গরম পথে এটি করছেন এবং কোডটিকে প্রচুর পরিমাণে বলা হয় তবে আপনি প্রচুর নির্দেশনা এবং সময় সাশ্রয় করতে পারেন।
বায়ইন্ডির

15

প্রাথমিক বরাদ্দ করা আকার নির্ধারণ করতে বা এটি প্রাথমিক কন্সট্রাক্টরে করতে আপনার রিজার্ভ ফাংশনটি ব্যবহার করতে হবে।

vector<CustomClass *> content(20000);

অথবা

vector<CustomClass *> content;
...
content.reserve(20000);

যখন আপনি reserve()উপাদানগুলি পান, তখন vectorঅনেকগুলি উপাদানের (কমপক্ষে?) জন্য পর্যাপ্ত জায়গা বরাদ্দ করা হবে। উপাদানগুলিতে অস্তিত্ব নেই vectorতবে মেমরিটি ব্যবহারের জন্য প্রস্তুত। এটি সম্ভবত গতি বাড়িয়ে দেবে push_back()কারণ মেমরিটি ইতিমধ্যে বরাদ্দ।


আকার বন্টন একটি অবিচ্ছেদ্য যুক্তি (যেমন std::vector<Custom Class*> content(100);)
adelbertc

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