'সাইজ_টি' বনাম 'ধারক :: আকার_প্রকার'


108

সেখানে মধ্যে একটি পার্থক্য আছে কি size_tএবং container::size_type?

আমি যা বুঝি তা size_tআরও সাধারণ এবং এটি যে কোনও ক্ষেত্রে ব্যবহার করা যেতে পারে size_type

তবে container::size_typeনির্দিষ্ট ধরণের ধারকগুলির জন্য অনুকূলিত?

উত্তর:


108

মান পাত্রে সংজ্ঞায়িত size_typeকরার একটি typedef যেমন Allocator::size_type(বরাদ্দকরণ একটি টেমপ্লেট প্যারামিটার), যার জন্য std::allocator<T>::size_typeকরা হয় সাধারণত হতে সংজ্ঞায়িত size_t(অথবা একটি সামঞ্জস্যপূর্ণ টাইপ)। স্ট্যান্ডার্ড কেসের ক্ষেত্রে এগুলি একই রকম।

তবে, আপনি যদি কাস্টম বরাদ্দকারী ব্যবহার করেন তবে ভিন্ন ভিন্ন অন্তর্নিহিত ধরণের ব্যবহার করা যেতে পারে। তাই container::size_typeসর্বোচ্চ সাধারণত্ব জন্য বাঞ্ছনীয়।


2
আপনি কি এই উত্তরটি পরিষ্কার করতে পারেন? আমি খসড়া মানদণ্ডগুলিকে যতদূর ফিরে N1804দেখেছি এবং আমি Allocator::size_typeএবং এর মধ্যে কোনও সম্পর্ক দেখতে পাচ্ছি না size_type। Libstdc ++ এ একটি তাত্ক্ষণিক নজরে এটির মতো কিছু দেখায় না anything
শফিক ইয়াঘমোর

1
@ শফিকিক ইয়াঘমুর, সুতরাং এই উত্তরটি কিছুটা পুরানো, তবে বহনযোগ্যতা সর্বাধিকতর করার জন্য আমি মনে করি যে পরামর্শটি এখনও দুর্দান্ত: সি ++ 03 নির্দিষ্ট "সারণি 32: আকার_প্রকার: একধরণের যা বরাদ্দ মডেলটির বৃহত্তম অবজেক্টের আকারকে উপস্থাপন করতে পারে।" সেই size_tসময়গুলিতে ছিল এই বাধাগুলির বাস্তব বাস্তবায়ন। যাইহোক, সি ++ 11 এ এটি এখন মূলত: std::make_unsigned<X::difference_type>::typeডিফল্টরূপে সংজ্ঞায়িত । বাস্তবে যা সম্ভবত একই বা সামঞ্জস্যপূর্ণ হবে size_t
ইভান তেরান

2
কেয়ার উত্তরটি ভুল .... দেখতে stackoverflow.com/questions/4849678/... ডিআর: টি এল size_t হতে হবে এবং C ++ হিসাবে 17 size_type অবচিত করা হবে allocators size_type প্রয়োজন নেই।
ব্যবহারকারী 3063349

1
@ ব্যবহারকারীর 3063349 আমি এই পৃষ্ঠায়, বা সি ++ 2017 স্ট্যান্ডার্ড (23.10.8) তে অবচয় দেখানোর জন্য কিছুই দেখতে পাচ্ছি না size_type। কি দেয়?
২৩7777

42
  • size_tকোনও বস্তুর আকারের জন্য ব্যবহৃত প্রকার হিসাবে সংজ্ঞায়িত হয় এবং এটি প্ল্যাটফর্ম নির্ভর
  • container::size_typeযে ধরনের কন্টেইনারে উপাদানের সংখ্যা জন্য ব্যবহৃত হয় হয় ধারক নির্ভরশীল

সমস্ত stdপাত্রে এটি ব্যবহার size_tকরে size_typeতবে প্রতিটি স্বতন্ত্র গ্রন্থাগার বিক্রেতা এমন একটি প্রকার চয়ন করে যা এটি তার ধারকটির জন্য উপযুক্ত বলে মনে করে।

আপনি যদি তাকান , আপনি দেখতে পাবেন যে size_typeQt ধারকগুলির সংস্করণ নির্ভর। Qt3 এ ছিল unsigned intএবং Qt4 এ এটি পরিবর্তন করা হয়েছিল int


1
কোনও প্রকার হিসাবে প্রকাশিত কোনও আকারের আকার পাওয়া আমার কাছে কিছুটা অদ্ভুত বলে মনে হয়। আমরা কি কোনও ধারকটির জন্য কখনও নেতিবাচক আকার নিতে পারি?
মিহাই টডর

10
@ মিহাইটোডর: সমস্ত কিছুর জন্য স্বাক্ষরযুক্ত ধরণের লোকদের ব্যবহার করা অস্বাভাবিক নয়, আমার ধারণা Qt মামলা অনুসরণ করছে। কারণটি হ'ল মিশ্র ক্রিয়াকলাপগুলি (বিশেষত তুলনা করে) এমন একটি দুর্যোগের ক্ষেত্র যা অনেক লোক সংখ্যার জন্য স্বাক্ষরযুক্ত প্রকারের ব্যবহার এড়াতে পছন্দ করবে, বরং এর সাথে ডিল করতে এবং / অথবা মিশ্র বিকল্পগুলি এড়ানো উচিত। শুধু কারণ স্বাক্ষরবিহীন ধরনের নেতিবাচক সংখ্যা প্রকাশ করতে পারে না, তার মানে এই নয় আপনি আছে সংখ্যার নেতিবাচক হতে পারে না তাদের ব্যবহার করার জন্য :-) আমি স্বীকার আমি বিস্মিত এটা intবদলে ssize_t, intধরনের ছোট হয়।
স্টিভ জেসপ

2
"সমস্ত স্ট্যান্ডের ধারকই সাইজ_টাকে আকার_প্রকার হিসাবে ব্যবহার করে" খুব ভ্রান্ত এবং বিভ্রান্তিমূলক। হ্যাঁ, তারা প্রায়শই (কমপক্ষে আমার সমস্ত সংকলকরা সেভাবেই কাজ করেছিল) তবে সি ++ ভাষার উল্লেখ উল্লেখ করে না, এটি সমস্ত স্টাইলের ধারক হিসাবে সমান হওয়া দরকার! এত যত্ন
ব্যবহারকারী 3063349

1
আমি মনে করি এটি লক্ষণীয় যে এমন একটি ধরণের যার আকারের দ্বারা
স্ট্যান্ডার্ড

8

জন্য std::[w]string, std::[w]string::size_typeসমান std::allocator<T>::size_type, যা সমান std::size_t। অন্যান্য ধারকগুলির জন্য, এটি কিছু প্রয়োগকে স্বাক্ষরবিহীন পূর্ণসংখ্যার ধরণের সংজ্ঞায়িত করে।

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

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

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