C ++ ভেক্টরের সমতুল্য, স্মৃতিযুক্ত?


87

সি ++ ভেক্টরের সি # সমতুল্য কী?

আমি এই বৈশিষ্ট্যটি অনুসন্ধান করছি:

মানসম্পন্ন অ্যারে অ্যাক্সেসের জন্য পারফরম্যান্সের কোনও জরিমানা না রেখে সাবলীলভাবে সঞ্চিত মেমরির একটি গতিশীল অ্যারে রাখা।

আমি অনুসন্ধান করেছিলাম এবং তারা বলে .NET equivalent to the vector in C++ is the ArrayList, তাই:

অ্যারেলিস্টে কি সেই স্বচ্ছ মেমরি বৈশিষ্ট্য রয়েছে?


4
কীভাবে মেমরিতে কোনও কাঠামো বরাদ্দ করা হয় তা নির্দিষ্ট করার জন্য (বা এমনকি ধারাবাহিকভাবে প্রত্যাশা করা) জন্য সিএলআর কি অপর্যাপ্তরূপে ধাতব ঘনিষ্ঠ নয়?
অ্যাফেক্স

উত্তর:


104

আপনি কোনওটি ব্যবহার করতে পারেন List<T>এবং যখন Tকোনও মান ধরণের হয় তা এটিকে জটিল মেমরিতে বরাদ্দ করা হবে যা Tকোনও রেফারেন্স টাইপ হলে কেস হবে না ।

উদাহরণ:

List<int> integers = new List<int>();
integers.Add(1);
integers.Add(4);
integers.Add(7);

int someElement = integers[1];

4
@ সিমনোর, List<T>ক্লাসের ডকুমেন্টেশনে অনেকগুলি উদাহরণ রয়েছে তবে আমি একটি উত্তর অন্তর্ভুক্ত করতে আমার উত্তর আপডেট করেছি।
দারিন দিমিত্রভ 4'11

4
আমি সিএলআরের সাথে 100% পরিচিত নই, তবে এটি বোঝা যায় যে Tএকটি রেফারেন্স টাইপ হলেও আপনার এখনও স্মৃতিযুক্ত স্মৃতি রয়েছে। এটি মূলত পয়েন্টারের একটি অ্যারে ...
জোসফাতভ

"টি টি যদি রেফারেন্স টাইপ হয় তবে এটি হবে না" - এটি ঠিক ততটাই কেস T[]... ওপিতে "এক্সেস বনাম স্ট্যান্ডার্ড অ্যারেগুলির জন্য কোনও পারফরম্যান্স জরিমানা" চেয়েছিল এবং এটি List<T>সরবরাহ করে। এবং যদি Tকোনও রেফারেন্স টাইপ হয়, এটি T*সি ++ এর সাথে সাদৃশ্যপূর্ণ , তাই আপনি সি ++ এর মতোই সামঞ্জস্যতা পাবেন। যদি কেউ চায় যে তারা নিজেরাই এই জিনিসগুলিকে সুসংগত করতে চায় তবে অবশ্যই উভয় ভাষায় মান ধরণের প্রয়োজন ... অবশ্যই পার্থক্যটি হ'ল সি ++ তে যে কোনও প্রকারের মান বা রেফ হিসাবে ব্যবহার করা যেতে পারে, অন্যদিকে সি # তে এটি শ্রেণীর / কাঠামোর পার্থক্যের মাধ্যমে এই ধরণের একটি সম্পত্তি।
জিম বাল্টার

আজ কিছু শিখেছি। আমি ভেবেছিলাম List<T>অভ্যন্তরীণভাবে সবসময় একটি লিঙ্কযুক্ত তালিকা হিসাবে প্রয়োগ করা হয়। সুতরাং কিভাবে এটি ডায়নামিকভাবে প্রসারিত যখন আমরা কল যখন Add()? ভিবি 6 এর মতো কিছু Redim Preserveযা পুরো অ্যারেটিকে কোনও নতুন অবস্থানে অনুলিপি করত?
dotNET

@ ডটনেট, অভ্যন্তরীণভাবে List<T>একটি ছোট অ্যারে তৈরি করে T[]। আইটেমগুলি অভ্যন্তরীণভাবে অ্যারেতে যুক্ত হয়। অ্যারের আকারটি শেষ হয়ে গেলে, নতুন অ্যারেটি আগেরটির দ্বিগুণ আকারে তৈরি হয়। ডেটা নতুন বৃহত্তর অ্যারে অনুলিপি করা হয়, আরও ছোট ধ্বংস করা হয়, ইত্যাদি। একটি ডেভেলপার .NET করার জন্য একটি ইঙ্গিতটি পূরণ করার আগে একটি বৃহৎ যথেষ্ট অভ্যন্তরীণ অ্যারে নির্মাণ দিতে পারে List কন্সট্রাকটর মাধ্যমে: new List<T>(expected_array_size)
আর্ট্রু

16

ব্যবহার List<T>। অভ্যন্তরীণভাবে এটি অ্যারে ব্যবহার করে এবং অ্যারেগুলি স্বচ্ছ মেমরি ব্যবহার করে।


4
সম্পূর্ণ সত্য নয়। যদি টি একটি রেফারেন্স টাইপ হয় তবে সেখানে স্থির মেমরি থাকবে না।
মাত্তেও মোসকা

4
@ মাত্তিও যদি আপনি উত্সটি দেখুন তবে সেখানে private T[] _items;ব্যাকএন্ড স্টোরেজ, রেফারেন্স টাইপ বা না করার জন্য ব্যবহৃত হয়েছে।
বালা আর

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

@ মাত্তোমোসকা উল্লেখগুলি কমপক্ষে স্বল্প সংরক্ষণের মাধ্যমে অন্তত একটি স্তরকে সরিয়ে ফেলবে remove আমার অনুমানের চেয়ে কিছু ভাল।
টিম সেগুইন

7
@ মাত্তোমোসকা ওপি "মান অ্যারেস অ্যাক্সেসের জন্য কোনও পারফরম্যান্স জরিমানা" চেয়েছিল। এটি তালিকার ক্ষেত্রে সত্য <টি> টি যাই হোক না কেন, সুতরাং এই পৃষ্ঠায় আপনার সমস্ত মন্তব্য অফ-পয়েন্ট।
জিম বাল্টার

16

সবার আগে, থেকে Arraylistবা দূরে থাকুন Hashtable। জেনেরিকের পক্ষে classes শ্রেণিগুলিকে অবহেলা হিসাবে বিবেচনা করা হবে। উত্তরাধিকারের উদ্দেশ্যে তারা এখনও ভাষায় রয়েছে।

এখন, আপনি যা খুঁজছেন তা List<T>ক্লাস। নোট করুন যে টি যদি মান মানের হয় তবে আপনার স্পষ্টত স্মৃতি রয়েছে, তবে টি যদি উল্লেখের কারণে হয় তবে এটি উল্লেখযোগ্য কারণ নয়।


15

সি # এর প্রচুর পরিমাণের রেফারেন্স রয়েছে। এমনকি যদি কোনও ধারক রেফারেন্সগুলি স্বচ্ছন্দভাবে সঞ্চয় করে তবে বস্তুগুলি নিজেরাই গাদা দিয়ে ছড়িয়ে ছিটিয়ে থাকতে পারে


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