অ্যারে বনাম ভেক্টর: প্রবর্তক মিল এবং পার্থক্য [বন্ধ]


111

C ++ এ অ্যারে এবং ভেক্টরের মধ্যে পার্থক্য কী? পার্থক্যের উদাহরণটিতে গ্রন্থাগার, প্রতীকবাদ, ক্ষমতা ইত্যাদি অন্তর্ভুক্ত থাকতে পারে

বিন্যাস

অ্যারেতে একটি নির্দিষ্ট ধরণের উপাদানগুলির একটি নির্দিষ্ট সংখ্যা থাকে। যাতে প্রোগ্রামটি সংকলিত হয় তখন সংকলকটি প্রয়োজনীয় পরিমাণের স্থান সংরক্ষণ করতে পারে, আপনাকে সংজ্ঞায়িত করার সময় অ্যারেতে থাকা উপাদানগুলির টাইপ এবং সংখ্যাটি নির্দিষ্ট করতে হবে। প্রোগ্রামটি সংকলিত হওয়ার সময় সংকলক অবশ্যই এই মানটি নির্ধারণ করতে সক্ষম হবেন। একবার অ্যারে সংজ্ঞায়িত হয়ে গেলে আপনি অ্যারের নির্দিষ্ট উপাদানগুলিতে অ্যাক্সেস করতে সূচীর পাশাপাশি অ্যারের জন্য সনাক্তকারী ব্যবহার করুন use [...] অ্যারেগুলি শূন্য-সূচকযুক্ত; এটি হ'ল প্রথম উপাদানটি সূচক 0 এ রয়েছে This

- সি ++ পকেট রেফারেন্স

ভেক্টর

একটি ভেক্টর বস্তুর একটি গতিশীল আকারের ক্রম যা অ্যারে-স্টাইলের operator[]এলোমেলো অ্যাক্সেস সরবরাহ করে। সদস্য ফাংশনটি push_backতার অনুলিপিগুলি অনুলিপি নির্মাণকারীর মাধ্যমে অনুলিপি করে, সেই অনুলিপিটি ভেক্টরের শেষ আইটেম হিসাবে যুক্ত করে এবং এর আকার একের সাথে বাড়িয়ে তোলে।pop_backশেষ উপাদানটি সরিয়ে বিপরীতটি করে। কোনও ভেক্টরের প্রান্ত থেকে আইটেমগুলি সন্নিবেশ করা বা মুছতে অবিচ্ছিন্ন ধ্রুবক সময় লাগে এবং অন্য কোনও স্থান থেকে সন্নিবেশ করা বা মুছতে লিনিয়ার সময় লাগে takes এগুলি ভেক্টরগুলির মূল বিষয়গুলি। তাদের কাছে আরও অনেক কিছু রয়েছে। বেশিরভাগ ক্ষেত্রে, কোনও ভেক্টর সি-স্টাইলের অ্যারের চেয়ে আপনার প্রথম পছন্দ হওয়া উচিত। প্রথমত, এগুলি গতিশীল আকারের, যার অর্থ তারা প্রয়োজন হিসাবে বৃদ্ধি করতে পারে। সি অ্যারেগুলির ক্ষেত্রে যেমন একটি অনুকূল স্থিতিশীল আকার বের করতে আপনাকে সব ধরণের গবেষণা করতে হবে না; একটি ভেক্টর প্রয়োজনীয় হিসাবে বৃদ্ধি পায় এবং আপনার প্রয়োজনে এটি ম্যানুয়ালি বড় বা ছোট আকারে পরিবর্তন করা যেতে পারে। দ্বিতীয়ত, ভেক্টরগুলি atসদস্য ফাংশনটির সাথে সীমা পরীক্ষা করার প্রস্তাব দেয় (তবে তা নয়) notoperator[]), যাতে আপনি আপনার প্রোগ্রাম ক্র্যাশ বা আরও খারাপ দেখা এবং দুর্নীতিগ্রস্থ ডেটা সহ চালিয়ে যাওয়া চালিয়ে যাওয়ার পরিবর্তে অস্তিত্বের সূচকটি উল্লেখ করলে আপনি কিছু করতে পারেন।

- সি ++ কুকবুক


সর্বাধিক প্রাথমিক পার্থক্য: এমন উদ্দেশ্য রয়েছে যার জন্য ভেক্টর একটি ভাল পছন্দ।
জেরি কফিন

1
"বিস্তৃত" এবং "কনসাইজ" অর্থোথোনাল। অর্থাৎ, কেবল একজনই অপরটিকে বোঝায় তা নয় , তারা একই স্কেলের উপরেও নয়।
অরবিটে হালকা ঘোড়দৌড়

2
আমি সেই লোকদের কাছে সত্যিই মন খারাপ করে থাকি যারা ঘনিষ্ঠ প্রশ্নগুলি হ'ল যে তথ্যগুলি আমি সন্ধান করছি। এটি প্রায়শই ঘটে।
রবার্ট তমলিন

উত্তর:


142

অ্যারে:

  • একটি অন্তর্নির্মিত ভাষা নির্মাণ;
  • C89 থেকে প্রায় অশোধিত আসুন;
  • উপাদানগুলির একটি সংলগ্ন, সূচকীয় ক্রম সরবরাহ করুন ; কোন ঘন্টা এবং শিস না;
  • স্থির আকারের হয়; আপনি সি ++ এ অ্যারের আকার পরিবর্তন করতে পারবেন না (যদি না এটি পিওডির একটি অ্যারে থাকে এবং এটির সাথে বরাদ্দ না দেওয়া হয় malloc);
  • তাদের আকার অবশ্যই একটি সংকলন-সময় ধ্রুবক হওয়া উচিত যদি না তারা গতিশীলভাবে বরাদ্দ দেওয়া হয়;
  • আপনি যে পরিমাণ ঘোষনা করেছেন তার উপর নির্ভর করে তারা তাদের সঞ্চয় স্থান গ্রহণ করে;
  • যদি গতিশীলভাবে বরাদ্দ দেওয়া হয়, আপনাকে অবশ্যই তাদের স্পষ্টভাবে ডিলেট করতে হবে;
  • যদি এগুলি গতিশীলভাবে বরাদ্দ করা হয় তবে আপনি কেবল একটি পয়েন্টার পান, এবং আপনি তাদের আকার নির্ধারণ করতে পারবেন না; অন্যথায়, আপনি ব্যবহার করতে পারেন sizeof(অতএব সাধারণ প্রতিমা) sizeof(arr)/sizeof(*arr), যা কোনও বিন্দুতে অজান্তে ব্যবহার করার সময় নিঃশব্দে ব্যর্থ হয়);
  • বেশিরভাগ পরিস্থিতিতে একটি পয়েন্টারে স্বয়ংক্রিয়ভাবে ক্ষয় হয়; বিশেষত, কোনও ফাংশনে তাদের পাস করার সময় এটি ঘটে, যার জন্য সাধারণত তাদের আকারের জন্য পৃথক প্যারামিটার পাস করা প্রয়োজন;
  • কোনও ফাংশন থেকে ফেরানো যাবে না;
  • সরাসরি অনুলিপি / বরাদ্দ করা যায় না;
  • বস্তুর গতিশীল অ্যারেগুলির জন্য একটি ডিফল্ট নির্মাতা প্রয়োজন, কারণ তাদের সমস্ত উপাদানগুলি প্রথমে তৈরি করা উচিত;

std::vector:

  • একটি টেম্পলেট শ্রেণি;
  • একটি সি ++ শুধুমাত্র নির্মাণ;
  • গতিশীল অ্যারে হিসাবে প্রয়োগ করা হয় ;
  • গতিশীলভাবে বেড়ে ওঠে এবং সঙ্কুচিত হয়;
  • স্বয়ংক্রিয়ভাবে তাদের স্মৃতি পরিচালনা করুন, যা ধ্বংসের পরে মুক্ত হয়;
  • (মান অনুসারে) ফাংশন থেকে / ফেরত দেওয়া যেতে পারে;
  • অনুলিপি / নির্ধারণ করা যায় (এটি সমস্ত সঞ্চিত উপাদানগুলির একটি গভীর অনুলিপি সম্পাদন করে);
  • পয়েন্টারগুলিতে ক্ষয় হয় না, তবে আপনি তাদের ডেটাতে স্পষ্টভাবে একটি পয়েন্টার পেতে পারেন ( &vec[0]আশানুরূপভাবে কাজ করার গ্যারান্টিযুক্ত);
  • সর্বদা অভ্যন্তরীণ গতিশীল অ্যারের সাথে তার আকার (বর্তমানে কতগুলি উপাদান সঞ্চিত রয়েছে) এবং ক্ষমতা ( বর্তমানে বরাদ্দকৃত ব্লকে কয়টি উপাদান সংরক্ষণ করা যেতে পারে ) নিয়ে আসে;
  • অভ্যন্তরীণ গতিশীল অ্যারে নিজেই বস্তুর ভিতরে বরাদ্দ করা হয় না (যার মধ্যে কেবল কয়েকটি "বুককিপিং" ক্ষেত্র রয়েছে), তবে প্রাসঙ্গিক টেম্পলেট প্যারামিটারে নির্দিষ্ট বরাদ্দকারী দ্বারা গতিশীলভাবে বরাদ্দ করা হয়; ডিফল্টরূপে ফ্রিস্টোর (তথাকথিত হিপ) থেকে মেমরি পাওয়া যায়, প্রকৃত বস্তুটি কীভাবে বরাদ্দ করা হয় তা থেকে স্বাধীনভাবে;
  • এই কারণে, তারা ছোট, স্বল্প-জীবনকালীন, স্থানীয় অ্যারেগুলির জন্য "নিয়মিত" অ্যারেগুলির তুলনায় কম দক্ষ হতে পারে;
  • পুনরায় স্থান দেওয়ার সময়, অবজেক্টগুলি অনুলিপি করা হয় (সরানো হয়েছে, সি ++ 11 এ);
  • বস্তু সংরক্ষণের জন্য ডিফল্ট নির্মাতার প্রয়োজন হয় না;
  • বাকি তথাকথিত এসটিএলের সাথে আরও ভালভাবে সংহত করা হয়েছে (এটি begin()/ end()পদ্ধতিগুলি, সাধারণ এসটিএল typedef, ...) সরবরাহ করে

অ্যারেগুলির জন্য "আধুনিক বিকল্প" বিবেচনা করুন - std::array; আমি ইতিমধ্যে বর্ণিত অন্য উত্তর মধ্যে পার্থক্য std::vectorএবং std::array, আপনি এটি কটাক্ষপাত আছে করতে পারেন।


1
আপনাকে ধন্যবাদ, @ মাত্তিও ইটালিয়া। একটি বা দুটি রেফারেন্স সুন্দর হবে।
ট্র্যাঙ্কট

1
@ ট্র্যাঙ্কট: যে কোনও ভাল সি ++ বই করবে।
মাত্তেও ইটালিয়া

6
@ ট্র্যাঙ্কট: আমি সত্যিই আপনাকে আরও বেশি ভাল রেফারেন্স দিতে পারি না - এই পোস্টে হাইলাইট করা পার্থক্যগুলি স্ট্যান্ডার্ডের বিভিন্ন অংশ থেকে আসে এবং একটি ভাল সি ++ ম্যানুয়ালটির সাহায্যে আরও ভালভাবে বোঝা যায়।
মাত্তেও ইটালিয়া

এত বিস্তৃত বিবরণের উদাহরণ দারুণ হবে!
carloswm85

26

আমি যুক্ত করব যে অ্যারেগুলি সি ++ তে খুব নিম্ন-স্তরের কনস্ট্রাক্টস এবং "দড়ি শেখার সময়" আপনার যথাসম্ভব দূরে থাকার চেষ্টা করা উচিত - এমনকি বর্জন স্ট্রস্ট্রপও এটি সুপারিশ করেন (তিনি সি ++ এর ডিজাইনার)।

ভেক্টরগুলি অ্যারে হিসাবে একই পারফরম্যান্সের খুব কাছাকাছি আসে তবে অনেকগুলি সুবিধার এবং সুরক্ষা বৈশিষ্ট্য সহ। কাঁচা অ্যারেগুলির সাথে চুক্তি করা API এর সাথে ইন্টারফেস করার সময় বা আপনার নিজের সংগ্রহগুলি তৈরি করার সময় আপনি সম্ভবত অ্যারে ব্যবহার শুরু করবেন।


1
অ্যাপ্লিকেশন প্রোগ্রাম ইন্টারফেস: ( en.wikedia.org/wiki/API )। এটি একটি সফ্টওয়্যার সত্তা (প্যাকেজ, গ্রন্থাগার, অপারেটিং সিস্টেম) এন্ট্রি পয়েন্টগুলির সংগ্রহ। কিছু এপিআই-তে স্ট্রিকাট (চর * ডিএসটি, চর * এসসিআর) এর মতো এন্ট্রি পয়েন্ট থাকবে, যেখানে ডিএসটি এবং এসসিআর কে অক্ষরের অ্যারে হিসাবে বিবেচনা করা হবে (যদিও ফাংশনের স্বাক্ষর অক্ষরের প্রতি নির্দেশক নির্দেশ করে)।
জন কলান

11

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

int myArray[100];
myArray[0]=1;
myArray[1]=2;
myArray[2]=3;

ভেক্টরগুলির জন্য, আপনি কেবল এটি ঘোষণা করুন এবং উপাদান যুক্ত করুন

vector<int> myVector;
myVector.push_back(1);
myVector.push_back(2);
myVector.push_back(3);
...

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

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