কখন ভেক্টর / তালিকা ব্যবহার করা উচিত?


17

আমি কখন তালিকাগুলি ব্যবহার করতে পারি তা বুঝতে পারি, তবে ভিডিও গেমসে তালিকার ব্যবহারের চেয়ে ভেক্টরগুলি ব্যবহার করা কখন ভাল fast তাড়াতাড়ি এলোমেলো অ্যাক্সেস করা কখন ভাল?

(এবং আমি বুঝতে পারছি কেন তালিকায় সন্নিবেশ / মুছতে দ্রুত হয় কেননা এটি কেবল পয়েন্টারগুলি সরিয়ে / যুক্ত করে, তবে এটি এখনও সম্পর্কিত আইটেমটি সন্ধান করতে পারে ...)


এতে ভেক্টর ট্যাগটি পুনরায় যুক্ত করা হয়েছে - তালিকাটি যদি বৈধ ট্যাগ হয় তবে ভেক্টরটিও খুব বেশি।
কাইলোটন

সম্ভবত ভেক্টর অপসারণ করা হয়েছে কারণ এটি গাণিতিক ভেক্টর বোঝাতে ব্যবহৃত হয়েছিল, স্ট্যান্ড :: ভেক্টর নয়।

1
কিভাবে তাদের উভয় নিক্স এবং করা সম্পর্কে container
deft_code

@ কাইলোটান: জো যেমন বলেছিল তেমনই। এই প্রশ্নটি অবশ্যই ভেক্টর সম্পর্কে ছিল, তবে এটি ভেক্টর ট্যাগের সাথে সম্পর্কিত নয়।
ডপপেলগ্র্রিনার 13

1
তাহলে আমরা কি কোনও অস্পষ্ট ট্যাগ মুছে ফেলি? এটি আমার কাছে ভুল সিদ্ধান্তের মতো শোনাচ্ছে - আপনার অনুসন্ধান পর্যাপ্ত পরিমাণের চেয়ে বেশি তথ্য সঞ্চারিত করাই ভাল। অযৌক্তিক ফলাফল এড়িয়ে যাওয়া সমার্থক শব্দগুলি খুঁজতে বুদ্ধিমানের চেয়ে সহজ।
কাইলোটান

উত্তর:


29

আমার থাম্বের নিয়ম, এবং আমি নিশ্চিত যে এটি নিয়ে বিতর্ক হবে is কখনই তালিকা ব্যবহার না করা (যদি না আপনার খুব দরকার হয় তবে খুব বড় বারের তালিকাগুলির মাঝামাঝি থেকে জিনিসগুলি সরিয়ে ফেলুন)।

সংক্ষিপ্ত স্মৃতিতে আপনার ধারকটিতে সমস্ত উপাদান রেখে আপনি যে গতি অর্জন করবেন (এবং তাই আরও ক্যাশে-বান্ধব) ভেক্টর যুক্ত / অপসারণ / পুনরায় আকার দেওয়ার অতিরিক্ত ব্যয়ের অফসেট।

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


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

11
@ ফ্রেডেরিক: এটি স্ট্যান্ডার্ড সি ++ প্রজ্ঞা, তবে এটি প্রায় সর্বদা ভুলও হয়। ভেক্টর, বিশেষত পয়েন্টারগুলির ভেক্টরগুলির সাথে ডিল করার সময় (যা আপনি প্রায়শই গেমসের জন্য থাকেন) মাঝখানে থেকে জিনিসগুলি সরিয়ে ফেলার জন্য খুব দ্রুত - এটি লিনিয়ার সময়, তবে এটি আইটেমের প্রতি খুব ছোট ওভারহেড। এটি ভেক্টরের মাধ্যমে ক্রমানুসারে পুনরাবৃত্তি করা আরও দ্রুত।

1
আপনি ঠিক কী ধরণের কাঠামো পাচ্ছেন তা আমি নিশ্চিত নই - এই ধরণের অপ্টিমাইজেশনের জন্য নির্দিষ্টভাবে কিছু বলার জন্য দৃ concrete় উদাহরণ প্রয়োজন। উদাহরণস্বরূপ, আপনার ব্যবহারের ক্ষেত্রে আমার প্রথম প্রতিক্রিয়াটি একটি আনর্ডারড সেট হবে যা সমানভাবে দ্রুত সন্নিবেশ, মুছে ফেলা এবং দেখার অনুমতি দেয়; আমার অভিজ্ঞতার সেটগুলি সম্পাদকদের মধ্যে বস্তুর জন্য দুর্দান্ত। তবে সম্পাদকগণের রিয়েল-টাইম পারফরম্যান্সের প্রয়োজনীয়তাগুলি অনেক বেশি - যেমন একটি "মুছুন" বোতামের প্রতিক্রিয়াটি যদি সেকেন্ডের 1/20 তম সময় নেয় বা দ্বিতীয় 10% সময়ের 1/2 তম সময় নেয় - তবে এটি ঠিক আছে খুব কমই তাদের জন্য প্রযোজ্য।

1
@ ফ্রাডেরিক ইম্বিয়াউল্ট মডিফাই করা এড \ রিমুটি করা সমস্যার খুব বেশি সমস্যা নয় যা সমস্যার সৃষ্টি করে। ভেক্টরকে একটানা রাখার জন্য অ্যাড-রিমুড পয়েন্টটি ভেক্টরের শেষ প্রান্তে অনুলিপি করা হয়। যদি উপাদান ক্রমের বিষয়টি বিবেচনা না করে আপনি মুছে ফেলা উপাদানটিকে শেষ উপাদানটির সাথে অদলবদল করতে পারেন তবে মুছে ফেলার জন্য এটি পপ করুন এবং অ্যাডের জন্য শেষে যুক্ত করুন।
স্টোনমেটাল

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

8

আপনার ডাটা স্ট্রাকচারের মাঝখানে পরিবর্তন করে যখন ইটারেটর অবৈধকরণ সমস্যা তৈরি করতে চলেছে তখন একটি তালিকা ব্যবহার করুন বা আপনার উপাদানগুলিকে বাছাই করা দরকার যাতে দ্রুত মাঝারি সংগ্রহ মুছার জন্য অদলবদল এবং পপ কৌশল কাজ করবে না এবং আপনার একটি বিশাল পরিমাণ রয়েছে মিড কালেকশন মোছার সংখ্যা।

আপনি ডেক ব্যবহার করেও বিবেচনা করতে পারেন। এটির ভ্যাক্টরের সাথে একই রকম পারফরম্যান্স বৈশিষ্ট্য রয়েছে তবে সংমিশ্রিত মেমরির জন্য ভেক্টরের প্রয়োজন নেই এবং এটি আরও কিছুটা নমনীয়।


ডিউকগুলি উল্লেখ করার জন্য একমাত্র ব্যক্তি হিসাবে +1 - আপনি উভয় প্রান্তে দ্রুত সন্নিবেশ / অপসারণ সহ ভেক্টরগুলির সামঞ্জস্যপূর্ণ স্মৃতি এবং অনুসন্ধানের গতির সুবিধা পান।

5

আপনার পছন্দ আপনার প্রয়োজন প্রতিফলিত করা উচিত। ভেক্টরগুলির সমস্ত উপাদান স্মৃতিতে ক্রমাগত থাকে এবং তালিকাগুলি পরবর্তী / পূর্ববর্তী উপাদানগুলিতে পয়েন্টার থাকে যাতে তাদের প্রত্যেকটির সুবিধা / অপব্যয় থাকে:

তালিকা:

  • পূর্ববর্তী এবং পরবর্তী উপাদানগুলিকে নির্দেশ করতে প্রতিটি উপাদান 2 টি পূর্ণসংখ্যা নেয়, তাই সাধারণভাবে এটি আপনার তালিকার প্রতিটি উপাদানগুলির জন্য 8 বাইট বেশি থাকে
  • সন্নিবেশ সময়রেখাতে লিনিয়ার: ও (এন)
  • অপসারণ একটি ধ্রুবক ক্রিয়াকলাপ: ও (1)
  • এক্স এলিমেন্টটি সময়ে লিনিয়ার অ্যাক্সেস করুন: ও (এন)

ভেক্টর:

  • কম স্মৃতি দরকার (অন্যান্য উপাদানগুলিতে কোনও পয়েন্টার নেই, এটি একটি সাধারণ গণিতের অ্যালগরিদম)
  • সরান সময় রৈখিক: ও (এন)
  • এক্স উপাদানটি অ্যাক্সেস অবিচ্ছিন্ন: ও (1) (এটি কারণ উপাদানগুলি স্মৃতিতে ক্রমাগত থাকে তাই এটি একটি সাধারণ গণিত ক্রিয়াকলাপ ভেক্টরপিটি + (x * বাইটস অফ টাইপ))
  • সন্নিবেশ রৈখিক সময়ে হতে পারে, তবে বেশিরভাগ ক্ষেত্রে, এটি একটি ধ্রুবক ক্রিয়াকলাপ: O (1) (অ্যারেতে ভেক্টর থাকলেও অ্যারেটি পূর্ণ হয় তাই অ্যারে অনুলিপিটি ঘন ঘন হয় না এমন সময় তার ক্ষমতাটি 2 বার সংরক্ষণ করে)

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

এই পোস্টটি স্ট্যাকওভারফ্লোতে দেখুন, এটি আপনার প্রয়োজনের ভিত্তিতে প্রাথমিক প্রশ্নগুলির সাথে একটি দুর্দান্ত গ্রাফ উপস্থাপন করে যা আপনাকে আপনার উত্তরগুলির উপর নির্ভর করে একটি নির্দিষ্ট ধারকটিতে নিয়ে যায়:

/programming/366432/extending-stdlist


3
সেই গ্রাফটি সত্যই একটি "আপনি কি পয়েন্টার এবং এক হাজারের চেয়ে কম সঞ্চয় করছেন?" -> ভেক্টর "নোড দিয়ে শুরু করা দরকার।

হ্যাঁ আপনি ঠিকই বলেছেন, আমি যে ধরণের সঞ্চিত তাও বিশ্লেষণ করা উচিত বলে বিবেচনা করি নি।
ফ্রেডরিক আইম্বিয়েল্ট

2

সাধারণত তালিকাগুলি সারিগুলির মতো কাঠামোর জন্য ব্যবহৃত হয় যেখানে প্রচুর পরিমাণে সংযোজন এবং অপসারণ অপারেশন রয়েছে। উদাহরণ: সত্তাগুলির সর্বদা পরিবর্তিত তালিকা যা আপডেট করা উচিত। তালিকায় নিজেই কেবল পর্দায় সত্তা রয়েছে এবং তাই ঘন ঘন পরিবর্তিত হয়।

ভেক্টর (বা অ্যারে) এমন কোনও সংকলনের জন্য আরও উপযুক্ত যা আপনার পরিবর্তনের মধ্যে স্বতন্ত্র আইটেমগুলিতে দ্রুত অ্যাক্সেসের প্রয়োজন হয় need উদাহরণ: একটি টাইল-মানচিত্র যেখানে আপনাকে কোনও প্রদত্ত সূচকে টাইলস দেখতে হবে।

টেট্রাডগুলির মতামত সত্য হতে পারে, তবে এটি ব্যবহৃত প্রোগ্রামিং ভাষার উপর নির্ভর করে। আমি দেখতে পাচ্ছি যে আপনি আপনার প্রশ্নটি ট্যাগ করেছেন c++, তবে আমি একটি উত্তর দেওয়ার চেষ্টা করেছি যা ভাষা নির্দিষ্ট নয়।


আচ্ছা, আমি এটিতে সিও রেখে দিতে পারি, তবে সি তে এমন পাত্রে নেই, তবে এটি ভাববার বিষয়: সি এর জন্য কি কোনও এসটিএলের মতো টিবারি আছে?
জোকুন

আমি অতীতে গ্লিব ( গ্রন্থাগার.gnome.org/devel/glib ) ব্যবহার করেছি , যা সি এর জন্য প্রচুর স্ট্যান্ডার্ড তথ্য কাঠামো প্রয়োগ করে I স্থিতিশীল।

0

কনসোল গেমগুলিতে আমরা কখনই স্ট্যান্ড :: তালিকা ব্যবহার করি না কারণ:

  1. আপনি যখনই কোনও নতুন আইটেম যুক্ত করেন এটি মেমরির বরাদ্দ করে। মেমরি বরাদ্দ ধীর।
  2. এটি পয়েন্টার পূর্ণ। পয়েন্টারগুলি খারাপ। একটি পয়েন্টার একটি ক্যাশে মিস। একটি ক্যাশে মিস খারাপ।

এমনকি এসটিডি :: ভেক্টর কনসোলগুলিতে পক্ষে হারাচ্ছে কারণ:

  1. আপনি প্রায়শই কেবল যত্নশীল হন, উদাহরণস্বরূপ, সমস্ত বস্তুর অবস্থান। উদাহরণস্বরূপ আপনি বস্তুর একে অপরের সাথে সংঘর্ষ করতে চান, সেক্ষেত্রে তাদের রঙ কী তা আপনার যত্ন নেই। সুতরাং আপনি চান যে সমস্ত অবস্থান মেমরির সাথে সুসংগত হোক এবং আপনি ক্যাশে দূষিত হওয়া এড়ানোর জন্য রঙগুলি আরও দূরে অন্য কোথাও হতে চান। তবে স্টাড :: ভেক্টর আপনাকে প্রতিটি বস্তুর জন্য সমস্ত কিছু মেমোরির সংলগ্ন অংশে সংরক্ষণ করতে হবে (উদাহরণস্বরূপ পজিশন রঙ) যদি আপনি সেগুলি ব্যবহার না করেন। এটি অপব্যয়।

5
@bmcnett "[] .. তবে স্টাড :: ভেক্টর আপনাকে প্রতিটি বস্তুর জন্য মেমরির একগুচ্ছ অংশে সবকিছু সংরক্ষণ করার প্রয়োজন" - এটি কোনও ধারকটির প্রশ্ন নয়, এটি আপনার ডেটা-বিন্যাসের প্রশ্ন, আপনার সমস্ত অবস্থান থাকতে পারে : একটি এসটিডি :: ভেক্টর সঙ্গে মেমরি একটি ক্রমাগত খণ্ড মধ্যেstruct point{float x, y, z, w}; std::vector<point> positions;
Maik Semder

আমার স্কুল এটি পছন্দ করতে চলেছে :)
জোকুন

2
-1 কারণ এই উত্তরটি ইতিমধ্যে এখানে ভিক্টরের আলোচনার আলোচনার তালিকায় কিছু যুক্ত করে না, এবং ভেক্টর ক্যাশে দূষণকারী সম্পর্কে এর দাবিটি ভুল, যেমন মাইকের বক্তব্য।

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

3
pointএকটি সি ++ অবজেক্ট বাদে (যেমনটি তেমন std::vectorসহজ কিছু float)। আপনি যে পার্থক্যটি আঁকতে চেষ্টা করছেন তা আমি জানি তবে আপনি এটি ব্যাখ্যা করার জন্য খারাপ কাজ করছেন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.