ভেক্টর বনাম এসটিএলে তালিকা


238

আমি কার্যকর এসটিএলে লক্ষ্য করেছি

ভেক্টর হল ক্রমের ধরণ যা ডিফল্টরূপে ব্যবহার করা উচিত।

এর অর্থ কী? দেখে মনে হচ্ছে দক্ষতা উপেক্ষা করে vectorকিছু করা যায়।

কেউ কি আমাকে এমন দৃশ্য উপস্থাপন করতে পারেন যেখানে vectorসম্ভাব্য বিকল্প নয় তবে listঅবশ্যই ব্যবহার করা উচিত?


6
যদিও এটি আপনি যা চেয়েছিলেন তা নয়, এটি ভেক্টরের কাছে ডিফল্ট হওয়ার অর্থ হ'ল আপনি সহজেই পুরানো কোড, সি লাইব্রেরি বা নন-টেম্পলেট লাইব্রেরির সাথে ইন্টারেক্ট করতে পারবেন, যেহেতু ভেক্টর একটি পয়েন্টারের "traditionalতিহ্যবাহী" গতিশীল অ্যারের চারপাশে একটি পাতলা মোড়ক এবং আকার।

18
বাজর্ন স্ট্রস্ট্রুপ প্রকৃতপক্ষে একটি পরীক্ষা করেছিলেন যেখানে তিনি এলোমেলো সংখ্যা তৈরি করেছিলেন এবং তারপরে সেগুলি যথাক্রমে একটি তালিকা এবং একটি ভেক্টরে যুক্ত করেছিলেন। সন্নিবেশগুলি তৈরি করা হয়েছিল যাতে তালিকা / ভেক্টরকে সর্বদা অর্ডার দেওয়া হয়েছিল। যদিও এটি সাধারণত "তালিকার ডোমেন" হলেও ভেক্টর একটি বড় ব্যবধানে তালিকাটিকে ছাড়িয়ে যায়। মেমরি অ্যাক্সেস ধীর হওয়ার কারণ এবং ক্রমযুক্ত ডেটার জন্য ক্যাশে আরও ভাল কাজ করে। এটি হবে "GoingNative 2012" থেকে তার তান সমস্ত উপলব্ধ
ফাঁকি


1
আপনি যদি বাজরেন স্ট্রাস্ট্রপের মূল বক্তব্যটি দেখতে চান যা @ ডেডিংয়েড উল্লেখ করেছেন, আমি এটি এখানে পেয়েছি: youtu.be/OB-bdWKwXsU?t=2672
brain56

উত্তর:


98

পরিস্থিতি যেখানে আপনি যে কোনও জায়গায় প্রচুর আইটেম সন্নিবেশ করতে চান তবে বারবার ক্রমের সমাপ্তি।

প্রতিটি বিভিন্ন ধরণের ধারকের জটিলতার গ্যারান্টি পরীক্ষা করে দেখুন:

স্ট্যান্ডার্ড পাত্রে জটিলতাগুলি কী কী?


2
শেষে উপাদানগুলি সন্নিবেশ করাও গণনা করা হয় কারণ এটি মেমরির বরাদ্দ এবং উপাদান অনুলিপি ব্যয় হতে পারে। এবং, একটি ভেক্টরের সূচনাতে এলেনেটগুলি সন্নিবেশ করা অসম্ভবের পরেও listরয়েছে,push_front
নোটলিস্ট

9
না, কোনও ভেক্টরের শেষে উপাদানগুলি সন্নিবেশ করানো ধ্রুবক সময় অনুসৃত is মেমরির বরাদ্দগুলি কেবলমাত্র মাঝে মধ্যে ঘটে এবং আপনি এটিকে প্রতিরোধের জন্য ভেক্টরকে পূর্বপরিচয় করতে পারেন। অবশ্যই, যদি আপনার অবশ্যই ধারাবাহিক সময় সন্নিবেশের গ্যারান্টি দেওয়া থাকে তবে আমার ধারণা এটি এখনও একটি সমস্যা is
ব্রায়ান

16
@ নোটিনলিস্ট - নিম্নলিখিতটি কি আপনার পক্ষে "অসম্ভবের পাশে"? v.insert (v.begin (), i)
ম্যানুয়েল

5
@ নোটিনলিস্ট - আমি আপনার সাথে একমত, এটি ঠিক যে আমি ওপিকে ভাবতে চাইনি যে কেউ যদি (পারফরম্যান্স) পায়ে নিজেকে গুলি করতে চায় তবে ইন্টারফেসটি সেখানে নেই is
ম্যানুয়েল

16
বাজর্ন স্ট্রস্ট্রুপ প্রকৃতপক্ষে একটি পরীক্ষা করেছিলেন যেখানে তিনি এলোমেলো সংখ্যা তৈরি করেছিলেন এবং তারপরে সেগুলি যথাক্রমে একটি তালিকা এবং একটি ভেক্টরে যুক্ত করেছিলেন। সন্নিবেশগুলি তৈরি করা হয়েছিল যাতে তালিকা / ভেক্টরকে সর্বদা অর্ডার দেওয়া হয়েছিল। যদিও এটি সাধারণত "তালিকার ডোমেন" হলেও ভেক্টর একটি বড় ব্যবধানে তালিকাটিকে ছাড়িয়ে যায়। মেমরি অ্যাক্সেস ধীর হওয়ার কারণ এবং ক্রমযুক্ত ডেটার জন্য ক্যাশে আরও ভাল কাজ করে। এটি হবে "GoingNative 2012" থেকে তার তান সমস্ত উপলব্ধ
ফাঁকি

409

ভেক্টর:

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

তালিকা:

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

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


2
এছাড়াও, ফ্রি স্টোর থেকে বরাদ্দ বিনামূল্যে নয়। :) কোনও ভেক্টরে নতুন আইটেম যুক্ত করা ও (লগ এন) ফ্রি স্টোর বরাদ্দগুলি সম্পাদন করে তবে আপনি reserve()ও (1) এ হ্রাস করতে কল করতে পারেন । একটি তালিকায় নতুন আইটেম যুক্ত করা (যেমন সেগুলি না ছড়িয়ে দেওয়া) ও (এন) ফ্রি স্টোর বরাদ্দগুলি সম্পাদন করে।
bk1e

7
আরেকটি বিবেচনা হ'ল listআপনি যখন উপাদানগুলি মুছবেন তখন মেমরি মুক্ত করে, কিন্তু vectorতা নয়। একজন vectorযখন আপনি তার আকার হ্রাস, যদি না আপনি ব্যবহার এটির ধারণক্ষমতা কমায় না swap()কৌতুক।
বিকে 1 ই

@ bk1e: আমি সত্যিই) রিজার্ভ আপনার কৌতুক (এবং swap 'র () :) জানতে চাই
Dzung গুয়েন

2
@ এনএক্সকিডি: যদি আপনার কোনও ভেক্টরে এন উপাদান যুক্ত করতে হয়, তবে v.reserve (v.size () + N) কল করুন যাতে এটি কেবল একটি বিনামূল্যে স্টোর বরাদ্দ করে। Swap 'র () কৌতুক এখানে: stackoverflow.com/questions/253157/how-to-downsize-stdvector
bk1e

1
@ সিম্প্লেনেম নং এটি যা বলে তা সঠিক। ভেক্টর বর্তমানে ভেক্টরে থাকা উপাদানগুলির জন্য স্থানের বাইরে অতিরিক্ত স্থান বরাদ্দ করে; সেই অতিরিক্ত ক্ষমতাটি ভেক্টর বাড়ানোর জন্য ব্যবহার করা হয় যাতে এটি বর্ধনশীল ও (1) মোড়ক হয়।
জনাথন এম ডেভিস

35

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


32

এখানে বেশিরভাগ উত্তর একটি গুরুত্বপূর্ণ বিবরণ মিস করে: কিসের জন্য?

আপনি পাত্রে কী রাখতে চান?

যদি এটি intগুলি এর সংকলন হয় তবে std::listপ্রতিটি দৃশ্যে হেরে যাবে, আপনি যদি পুনর্বিবেচনা করতে পারেন তবে তা আপনি কেবল সামনে থেকে সরিয়ে ফেলুন ইত্যাদি ists তালিকাগুলি ধীরে ধীরে ধীরে ধীরে হয়, প্রতিটি সন্নিবেশ আপনাকে বরাদ্দকারীর সাথে ইন্টারঅ্যাকশন ব্যয় করে। এটি উদাহরণস্বরূপ প্রস্তুত করা অত্যন্ত কঠিন হবে, যেখানে list<int>মারধর করে vector<int>। এবং তারপরেও, আরও deque<int>ভাল বা ঘনিষ্ঠ হতে পারে, তালিকাগুলি ব্যবহারে সন্ধান না করা, যার মেমরির ওভারহেড বেশি থাকবে।

তবে, যদি আপনি ডেটাগুলির বৃহত, কুরুচিপূর্ণ ব্লবগুলি নিয়ে কাজ করে থাকেন - এবং এর মধ্যে কয়েকটি - আপনি সন্নিবেশ করানোর সময় সামগ্রিকভাবে গড়তে চান না, এবং পুনর্নির্মাণের কারণে অনুলিপি করা একটি বিপর্যয় হতে পারে - তবে আপনি সম্ভবত এটির সাথে আরও ভাল হতে পারেন may list<UglyBlob>চেয়ে vector<UglyBlob>

তবুও, আপনি যদি আবারও স্যুইচ করেন vector<UglyBlob*>বা vector<shared_ptr<UglyBlob> >আবারও - তালিকাটি পিছনে থাকবে।

সুতরাং, অ্যাক্সেস প্যাটার্ন, লক্ষ্য উপাদান গণনা ইত্যাদি এখনও তুলনাটিকে প্রভাবিত করে, তবে আমার মতে - উপাদানগুলির আকার - অনুলিপি করার ব্যয় ইত্যাদি affects


1
আরও একটি প্রতিফলন, যা আমি ছিল যখন মায়ার্স দ্বারা "কার্যকরী STL" পড়া: এর একটি অদ্ভুত সম্পত্তি list<T>থেকে সম্ভাবনা আছে spliceমধ্যে হে (1) । আপনার যদি অবিচ্ছিন্নভাবে স্প্লাইসিংয়ের প্রয়োজন হয় তবে তালিকার পছন্দের কাঠামোও থাকতে পারে;)
টমাসজ গ্যান্ডার

+1 - এমনকি এটি হওয়ার দরকার নেই UglyBlob- এমনকি কয়েকটি স্ট্রিং সদস্যের সাথে থাকা কোনও সামগ্রী সহজেই অনুলিপি করে ব্যয় করতে পারে তবে অনুলিপিটির ব্যয় হবে । এছাড়াও: স্থানটিকে অবহেলা করবেন না vectorআকারের কয়েক ডজন বাইটের হোল্ডিং অবজেক্টগুলির তাত্পর্যপূর্ণ বৃদ্ধি কারণ হতে পারে (যদি আপনি reserveআগেই না করতে পারেন )।
মার্টিন বা

vector<smart_ptr<Large>>বনাম হিসাবে list<Large>- আমি বলব, যদি আপনার উপাদানগুলির এলোমেলো অ্যাক্সেসের প্রয়োজন হয় তবে তা vectorবোধগম্য হয়। আপনার যদি এলোমেলো অ্যাক্সেসের প্রয়োজন না হয় তবে listমনে হয় এটি সহজ এবং সমানভাবে সম্পাদন করা উচিত।
মার্টিন বা

19

স্ট্যান্ড :: তালিকার একটি বিশেষ ক্ষমতা হ'ল স্প্লিক্লিং (অংশের সাথে সংযোগ স্থাপন বা একটি সম্পূর্ণ তালিকাকে অন্য তালিকায় স্থানান্তরিত করা)।

অথবা সম্ভবত যদি আপনার বিষয়বস্তু অনুলিপি করা খুব ব্যয়বহুল হয়। এই জাতীয় ক্ষেত্রে এটি সস্তা হতে পারে, উদাহরণস্বরূপ, একটি তালিকা দিয়ে সংগ্রহটি সাজান।

এছাড়াও মনে রাখবেন যে সংগ্রহটি যদি ছোট হয় (এবং বিষয়বস্তুগুলি অনুলিপি করা বিশেষ ব্যয়বহুল নয়) তবে কোনও ভেক্টর এখনও কোনও তালিকা সরিয়ে ফেলতে পারে, এমনকি আপনি যে কোনও জায়গায় sertোকান এবং মুছুন এমনকি যদি। একটি তালিকা প্রতিটি নোডকে স্বতন্ত্রভাবে বরাদ্দ দেয় এবং এটি কয়েকটি সাধারণ অবজেক্টের চারপাশে স্থানান্তরিত করার চেয়ে অনেক বেশি ব্যয়বহুল।

আমি মনে করি না যে খুব কঠোর নিয়ম আছে। এটি নির্ভর করে আপনি সাধারণত ধারকটির সাথে কী করতে চান, পাশাপাশি আপনি ধারকটি কতটা প্রত্যাশিত এবং এতে থাকা প্রকারটি নির্ভর করে। একটি ভেক্টর সাধারণত একটি তালিকা ট্রাম্প করে, কারণ এটি এর বিষয়বস্তুগুলিকে একক সংলগ্ন ব্লক হিসাবে বরাদ্দ করে (এটি মূলত একটি গতিশীলভাবে বরাদ্দ করা অ্যারে, এবং বেশিরভাগ পরিস্থিতিতে একটি গুচ্ছ জিনিসকে ধরে রাখার সবচেয়ে কার্যকর উপায়) ray


1
+1 টি। স্প্লিজিং উপেক্ষা করা হয়, তবে দুর্ভাগ্যক্রমে ধ্রুবক-সময় কাঙ্ক্ষিত নয়। : ((এটি তালিকা হতে পারে না: আকারটি ধ্রুবক সময় হয়)))

আমি বেশ নিশ্চিত যে তালিকাটি :: মাপটি হ'ল (এটি হতে দেওয়া) এই কারণেই লিনিয়ার।
আঙ্কেলবেন্স

1
@ রোজার: list::sizeঅবিচ্ছিন্ন সময় প্রয়োজন হয় না। দেখুন stackoverflow.com/questions/228908/is-listsize-really-on এবং gcc.gnu.org/ml/libstdc++/2005-11/msg00219.html
Potatoswatter

@ পোটাটোসওয়াতর: মানটি অস্পষ্ট এবং ফলস্বরূপ আপনি "সম্মতিযুক্ত" বাস্তবায়নের উপর নির্ভর করতে পারবেন না এটি এটিকে আরও জটিল করে তোলে। পোর্টেবল এবং নির্ভরযোগ্য গ্যারান্টি পেতে আপনাকে আক্ষরিক অর্থে stdlib এড়াতে হবে।

@ রজার: হ্যাঁ, দুর্ভাগ্যক্রমে। আমার বর্তমান প্রকল্পটি স্প্লাইস অপারেশনের উপর দৃ strongly়ভাবে নির্ভর করে এবং সেই কাঠামোটি প্রায় সোজা সি। আরও দুর্ভাগ্যক্রমে, N3000 spliceবিভিন্ন তালিকার মধ্যে ক্রমটি রৈখিক জটিলতা হিসাবে নির্দিষ্ট করা হয়েছে এবং sizeবিশেষত ধ্রুবক। সুতরাং, যারা sizeবা যে কোনও ক্ষেত্রে পুনরাবৃত্তি করে এমন নভোসীদের সংস্থান করতে , পুরো শ্রেণির অ্যালগোরিদমগুলি এসটিএল, বা কোনও "অনুগত" ধারক পর্বের বাইরে চলে যায়।
পোটোসওয়টার

13

ভাল আমার ক্লাসের শিক্ষার্থীরা ভেক্টর ব্যবহার করা আরও কার্যকর যখন আমাকে বোঝাতে যথেষ্ট অক্ষম বলে মনে হয়, তবে আমাকে তালিকা ব্যবহারের পরামর্শ দেওয়ার সময় তারা বেশ খুশি লাগে।

এটি আমি এটি বুঝতে পারি

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

ভেক্টরগুলি : ভেক্টরগুলি ব্যবহার করার সময়, মেমরিটি নিয়মিত অ্যারেগুলির মতো অনেক বেশি সংগঠিত হয়: প্রতিটি এন-তম আইটেমের ঠিক পরে (এন -1) তম আইটেমের পরে এবং (এন + 1) তম আইটেমের আগে সংরক্ষণ করা হয়। কেন এটি তালিকার চেয়ে ভাল? কারণ এটি দ্রুত এলোমেলো অ্যাক্সেসের অনুমতি দেয়। এখানে কীভাবে: আপনি যদি কোনও ভেক্টরের কোনও আইটেমের আকার জানেন এবং যদি তারা স্মৃতিতে সামঞ্জস্যপূর্ণ হন তবে আপনি সহজেই অনুমান করতে পারবেন যে এন-থ্রি আইটেমটি কোথায়; ভেক্টরের সাহায্যে আপনি যা চান তা পড়তে আপনাকে তালিকার সমস্ত আইটেম ব্রাউজ করতে হবে না, আপনি সরাসরি এটি পড়তে পারেন, একটি তালিকা সহ যা আপনি পারবেন না। অন্যদিকে, ভেক্টর অ্যারে সংশোধন করুন বা একটি মান পরিবর্তন করুন আরও ধীর।

মেমরিতে যুক্ত / সরানো যায় এমন অবজেক্টগুলির ট্র্যাক রাখতে তালিকাগুলি আরও উপযুক্ত। যখন আপনি প্রচুর পরিমাণে একক আইটেম থেকে কোনও উপাদান অ্যাক্সেস করতে চান তখন ভেক্টরগুলি আরও উপযুক্ত।

তালিকা কীভাবে অপ্টিমাইজ করা হয় তা আমি জানি না, তবে আপনাকে জানতে হবে যে আপনি যদি দ্রুত পঠনের অ্যাক্সেস চান তবে আপনার ভেক্টর ব্যবহার করা উচিত, কারণ এসটিএল কতগুলি ভাল তালিকা বদ্ধ করে, এটি ভেক্টরের চেয়ে পঠন-অ্যাক্সেসে তত দ্রুত হবে না।


"ভেক্টরের অ্যারে সংশোধন করুন বা একটি মান পরিবর্তন করা অনেক ধীর গতিতে" - যেমন পড়ছেন, ভেক্টর তাদের নিম্ন-স্তরের এবং স্বতঃস্ফূর্ত প্রকৃতির কারণে ভাল পারফরম্যান্সের জন্য পূর্বনির্ধারিত হওয়ার বিষয়ে আপনি যা বলেছিলেন তার বিপরীতে এটি মনে হয়। আপনি কি এটি বলতে পারেনি যে reallocatingvector তার পরিবর্তন দ্বারা সৃষ্ট আকার ধীর হতে পারে? তারপরে সম্মত হয়েছিলেন, তবে যেখানে reserve()ব্যবহার করা যেতে পারে সেখানে এই সমস্যাগুলি এড়ানো হয়।
আন্ডারস্কোর_ড

10

মূলত একটি ভেক্টর হ'ল স্বয়ংক্রিয় মেমরি পরিচালনার একটি অ্যারে। ডেটা মেমরির সাথে সংগতিপূর্ণ। মাঝখানে ডেটা toোকানোর চেষ্টা করা একটি ব্যয়বহুল ক্রিয়াকলাপ।

একটি তালিকায় তথ্য সম্পর্কিত নয় এমন মেমরির অবস্থানগুলিতে সংরক্ষণ করা হয়। মাঝখানে সন্নিবেশ করাতে নতুনটির জন্য জায়গা তৈরি করতে কিছু ডেটা অনুলিপি করা জড়িত না।

আপনার প্রশ্নের উত্তর সুনির্দিষ্টভাবে জানাতে আমি এই পৃষ্ঠাটি উদ্ধৃত করব

ভেক্টরগুলি উপাদানগুলিতে অ্যাক্সেস করার জন্য এবং সিকোয়েন্সের শেষে থেকে উপাদানগুলি যুক্ত করতে বা সরাতে সাধারণত সবচেয়ে কার্যকর efficient অপারেশনগুলিতে যেগুলি অন্তর্ভুক্ত ব্যতীত অন্য অবস্থানগুলিতে উপাদানগুলি সন্নিবেশ করানো বা অপসারণের সাথে জড়িত, তারা ডেকা এবং তালিকার চেয়ে খারাপ সম্পাদন করে এবং তালিকার চেয়ে কম সামঞ্জস্যপূর্ণ পুনরাবৃত্তকারী এবং রেফারেন্স রাখে।


9

যে কোনও সময় আপনার পুনরাবৃত্তি অবৈধ করতে পারবেন না।


2
কিন্তু কিনা ক্রমাগত জিজ্ঞাসা না করে iterators সম্পর্কে সেই উপসংহারে ঝাঁপ কখনো রেফারেন্স একটি মধ্যে dequeযথেষ্ট হবে।
পোটোসওয়টার

8

সিকোয়েন্সের মাঝখানে যখন আপনার প্রচুর সন্নিবেশ বা মুছুন। যেমন একটি মেমরি পরিচালক।


সুতরাং তাদের মধ্যে পার্থক্য কেবল দক্ষতা, কার্যকরী সমস্যা সম্পর্কে নয়।
স্কাইডোর

তারা উভয় অবশ্যই উপাদানগুলির একটি ক্রম মডেল । ব্যবহারের ক্ষেত্রে একটি সামান্য পার্থক্য রয়েছে, যেমন @ ডিরেক্টরজেন্টি উল্লেখ করেছেন তবে আপনার "প্রায়শই সম্পন্ন" অপারেশনগুলির জটিলতাটি দেখতে হবে কোন ক্রমটি বেছে নেবেন তা সিদ্ধান্ত নিতে (@ মার্টিন উত্তর)।
আরাক

@ স্কাইটিউর - কয়েকটি কার্যকরী পার্থক্য রয়েছে। উদাহরণস্বরূপ, কেবল ভেক্টর এলোমেলো অ্যাক্সেস সমর্থন করে (অর্থাত্, সূচকযুক্ত করা যেতে পারে)।
ম্যানুয়েল

2
@ স্কাইওয়ার: দক্ষতা অনুবাদে অনুবাদ করে। খারাপ পারফরম্যান্স কার্যকারিতা নষ্ট করতে পারে। পারফরম্যান্স হ'ল সি ++ এর সুবিধা।
পোটোসওয়টার

4

পুনরাবৃত্তির বৈধতা সংরক্ষণ করা তালিকা ব্যবহারের একটি কারণ। অন্যটি হ'ল যখন আপনি কোনও ভেক্টরকে আইটেমগুলি ধাক্কা দেওয়ার সময় পুনঃব্যবহার করতে চান না। এটি রিজার্ভের বুদ্ধিমান ব্যবহার () দ্বারা পরিচালিত হতে পারে তবে কিছু ক্ষেত্রে কেবল একটি তালিকা ব্যবহার করা সহজ বা আরও সম্ভাব্য।


4

আপনি যখন ধারকগুলির মধ্যে বস্তুগুলি সরাতে চান, আপনি ব্যবহার করতে পারেন list::splice

উদাহরণস্বরূপ, একটি গ্রাফ পার্টিশনিং অ্যালগরিদম ক্রমবর্ধমান সংখ্যক ধারকগুলির মধ্যে ক্রমাগত বিভক্ত অবজেক্ট থাকতে পারে। বস্তুগুলি একবার শুরু করা উচিত এবং সর্বদা স্মৃতিতে একই অবস্থানগুলিতে থাকা উচিত। রিলোক্যাক্ট না করে রিলিংক করে এগুলি পুনর্বিন্যাস করা আরও দ্রুত faster

সম্পাদনা করুন: লাইব্রেরিগুলি সি ++ 0 এক্স বাস্তবায়নের জন্য প্রস্তুত হওয়ার সাথে সাথে একটি উপসংশকে তালিকায় বিভক্ত করার সাধারণ ক্ষেত্রে ক্রম দৈর্ঘ্যের সাথে লিনিয়ার জটিলতা হয়ে উঠছে। এটি কারণ splice(এখন) এর মধ্যে উপাদানগুলির সংখ্যা গণনা করার জন্য ক্রমটি পুনরাবৃত্তি করা দরকার। (কারণ তালিকার আকারটি রেকর্ড করা দরকার)) কেবল তালিকাটি গণনা করা এবং পুনরায় লিঙ্ক করা অন্য বিকল্পগুলির চেয়ে এখনও দ্রুত এবং সম্পূর্ণ তালিকা বা একটি একক উপাদানকে বিভক্ত করা ধ্রুব জটিলতার সাথে বিশেষ ঘটনা। তবে, যদি আপনার বিভক্ত হওয়ার দীর্ঘ ক্রম থাকে তবে আপনাকে আরও ভাল, পুরানো ফ্যাশনযুক্ত, অ-মাপসই ধারক হিসাবে খনন করতে হবে।


2

একমাত্র কঠোর নিয়ম যেখানে listব্যবহার করা আবশ্যক তা হ'ল যেখানে আপনাকে ধারকটির উপাদানগুলিতে পয়েন্টার বিতরণ করতে হবে।

এর বিপরীতে vector, আপনি জানেন যে উপাদানগুলির মেমোরিটি পুনরায় প্রদর্শিত হবে না। যদি এটি হতে পারে তবে আপনার অব্যবহৃত স্মৃতিতে পয়েন্টার থাকতে পারে যা সর্বোপরি একটি বড় নম্বর এবং সবচেয়ে খারাপ একটি SEGFAULT

(টেকনিক্যালি একটি vectorএর *_ptrআরো would কাজ কিন্তু যে ক্ষেত্রে আপনি এমুলেট listযাতে শুধু শব্দার্থবিদ্যা আছে।)

অন্যান্য নরম নিয়মগুলি কোনও ধারকটির মাঝখানে উপাদানগুলি সন্নিবেশ করার সম্ভাব্য পারফরম্যান্স ইস্যুগুলির সাথে listকরতে হবে , যার ফলে পছন্দনীয় হবে।


2

এটিকে সহজ করুন-
দিনের শেষে আপনি যখন সি ++ তে পাত্রে নির্বাচন করে বিভ্রান্ত হন তখন এই ফ্লো চার্ট চিত্রটি ব্যবহার করুন (আমাকে ধন্যবাদ বলুন): - এখানে চিত্রের বর্ণনা দিন

ভেক্টর-
১. ভেক্টর সংক্রামক মেমরির উপর ভিত্তি করে
২. ভেক্টর ছোট ডেটা-সেট-এ যাওয়ার উপায়
3.. ডেটা-সেটে ট্র্যাক্স করার সময় ভেক্টর সবচেয়ে দ্রুত সঞ্চালন করে
4.. ভেক্টর সন্নিবেশ মোছা বিশাল ডেটা-সেটে ধীর হয় তবে খুব ছোটের জন্য দ্রুত

তালিকা-
1. তালিকা হিপ মেমোরির উপর ভিত্তি করে
২. তালিকা খুব বিশাল ডেটা-সেট-এ যাওয়ার উপায়
3.. তালিকাটি ছোট ডেটা-সেটটি ট্র্যাভার করে তুলনামূলকভাবে ধীর হয় তবে বিশাল ডেটা-সেটে
দ্রুত 4.. তালিকার সন্নিবেশ মোছা দ্রুত হয় বিশাল ডেটা সেট কিন্তু ছোটগুলিতে ধীর


1

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


0

কোনও ভেক্টর এবং তালিকার ক্ষেত্রে , আমার সাথে থাকা প্রধান পার্থক্যগুলি হ'ল:

ভেক্টর

  • একটি ভেক্টর তার উপাদানগুলিকে সংলগ্ন স্মৃতিতে সঞ্চয় করে। সুতরাং, কোনও ভেক্টরের অভ্যন্তরে এলোমেলো অ্যাক্সেস সম্ভব যার অর্থ কোনও ভেক্টরের কোনও উপাদান অ্যাক্সেস করা খুব দ্রুত কারণ আমরা সেই উপাদানটি অ্যাক্সেস করার জন্য আইটেম সূচকের সাথে বেস ঠিকানাটি কেবল গুন করতে পারি। প্রকৃতপক্ষে, এই উদ্দেশ্যে এটি কেবল ও (1) বা ধ্রুবক সময় নেয়।

  • যেহেতু কোনও ভেক্টর মূলত একটি অ্যারে আবৃত করে, আপনি যখনই কোনও উপাদান ভেক্টরে (ডায়নামিক অ্যারে) সন্নিবেশ করান তখন সময় ব্যয়বহুল নতুন উপাদানগুলিকে সংযুক্ত করতে মেমরির একটি নতুন সংলগ্ন ব্লক খুঁজে বের করে নিজেকে পরিবর্তন করতে হয়।

  • এটির মধ্যে অন্য উপাদানগুলিতে কোনও পয়েন্টার সঞ্চয় করতে অতিরিক্ত মেমরি গ্রাস করে না।

তালিকা

  • একটি তালিকা তার উপাদানগুলিকে অ-স্বচ্ছ স্মৃতিতে সঞ্চয় করে। সুতরাং, তালিকার ভিতরে এলোমেলো অ্যাক্সেস সম্ভব নয় যার অর্থ এটির উপাদানগুলিকে অ্যাক্সেস করতে আমাদের পয়েন্টারগুলি ব্যবহার করতে হবে এবং সেই তালিকাটি ট্র্যাক করতে হবে যা ভেক্টরের তুলনায় ধীর। এটি O (n) বা লিনিয়ার সময় নেয় যা হে (1) এর চেয়ে ধীর হয়।

  • যেহেতু একটি তালিকা অ-স্বচ্ছ মেমরি ব্যবহার করে, তাই তালিকার ভিতরে কোনও উপাদান inোকাতে সময় নেওয়া তার ভেক্টর অংশের ক্ষেত্রে তুলনায় অনেক বেশি কার্যকর কারণ মেমরির পুনঃব্যবস্থা এড়ানো হয়।

  • এটি নির্দিষ্ট উপাদানের আগে এবং পরে উপাদানটির পয়েন্টারগুলি সঞ্চয় করতে অতিরিক্ত মেমরি গ্রহণ করে।

সুতরাং, এই পার্থক্যগুলি মাথায় রেখে, আমরা সাধারণত প্রদত্ত দৃশ্যে ভেক্টর বনাম তালিকার বিজয়ী সিদ্ধান্ত নিতে মেমরি , ঘন ঘন এলোমেলো অ্যাক্সেস এবং সন্নিবেশ বিবেচনা করি ।


0

তালিকাটি দ্বিগুণ লিঙ্কযুক্ত তালিকা যাতে কোনও উপাদান সন্নিবেশ করা এবং মোছা সহজ হয়। আমাদের কেবল কয়েকটি পয়েন্টার পরিবর্তন করতে হবে, যখন ভেক্টরে যদি আমরা মাঝখানে একটি উপাদান toোকাতে চাই তবে প্রতিটি উপাদান একটি সূচক দ্বারা স্থানান্তরিত করতে হয়। এছাড়াও যদি ভেক্টরের আকার পূর্ণ হয় তবে প্রথমে এটির আকার বাড়াতে হবে। সুতরাং এটি একটি ব্যয়বহুল অপারেশন। সুতরাং যেখানে সন্নিবেশ এবং মুছে ফেলা অপারেশনগুলি প্রায়শই এই জাতীয় ক্ষেত্রে ব্যবহার করা উচিত list

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