কেবলমাত্র দুটি সদস্যের সাথে কি একটি std::pair
এবং এর মধ্যে পার্থক্য রয়েছে std::tuple
? (স্পষ্টতই std::pair
দু'জন এবং মাত্র দু'জন সদস্যের প্রয়োজন রয়েছে এবং এর tuple
কম-বেশি থাকতে পারে ...)
উত্তর:
কিছু পার্থক্য রয়েছে:
std::tuple
স্ট্যান্ডার্ড-লেআউট দ্বারা কখনই হতে পারে না (কমপক্ষে, এটি স্ট্যান্ডার্ডের দ্বারা আবশ্যক নয় )। প্রতিটি std::pair<T, Y>
উভয় মান-বিন্যাস T
এবং Y
মান-বিন্যাস হয়।
এটির pair
চেয়ে একটি এর সামগ্রীর প্রাপ্তি কিছুটা সহজ tuple
। ক্ষেত্রে আপনাকে একটি ফাংশন কল ব্যবহার করতে হবে tuple
, যখন pair
কেসটি কেবল একটি সদস্য ক্ষেত্র।
কিন্তু এটি সম্পর্কে।
std::map
ব্যবহার std::pair<const Key,T>
করে value_type
। টিপলসটি ঠিক কোথায় ব্যবহৃত হয় std::map
?
std::map
।
এটি একটি খুব দেরিতে উত্তর তবে নোট করুন যেহেতু std::pair
সদস্য ভেরিয়েবলগুলির সাথে সংজ্ঞায়িত হয়েছে, খালি বেস শ্রেণীর অপ্টিমাইজেশন ব্যবহার করে এর আকারটি অনুকূলিত করা যায় না ( first
এবং second
অবশ্যই একটি বা উভয়ই শূন্য শ্রেণীর হলেও পৃথক ঠিকানা দখল করতে হবে)। এটি প্রান্তিককরণের যা কিছু প্রয়োজনীয়তা second_type
রয়েছে তার দ্বারা বর্ধিত , সুতরাং সবচেয়ে খারাপ ক্ষেত্রে ফলাফলটি std::pair
মূলত এটির আকারের দ্বিগুণ হবে।
std::tuple
কেবল সহায়ক ফাংশনগুলির মাধ্যমে অ্যাক্সেসের অনুমতি দেয়, সুতরাং এক বা অন্যটি খালি থাকলে ওভারহেডে সঞ্চয় করে উভয় প্রকারের থেকে পাওয়া সম্ভব। খুব অন্তত জিসিসি বাস্তবায়ন, স্পষ্টভাবে এই আছে ... এই যাচাই করতে হেডার মাধ্যমে অকর্মা পারে, তেমনই আছে এই প্রমাণ হিসাবে।
[[no_unique_address]]
std::pair
এর অসুবিধা অপসারণ করা উচিত ।
একটি std::tuple
নাম দীর্ঘ (একটি অতিরিক্ত চরিত্র)। এই চরিত্রগুলির মধ্যে অনেকগুলি ডান হাতে টাইপ করা হয়েছে, বেশিরভাগ লোকের পক্ষে টাইপ করা এত সহজ।
এটি বলেছিল, std::pair
কেবল দুটি মান থাকতে পারে - শূন্য নয়, এক, তিন বা আরও বেশি। দুটি মান। একটি টিপল, তবে মানগুলির সংখ্যার উপর প্রায় কোনও শব্দার্থিক সীমাবদ্ধতা নেই। একটি std::pair
, তাই, ব্যবহারের জন্য আরও সঠিক, প্রকারের নিরাপদ প্রকারটি যদি আপনি প্রকৃতপক্ষে মানগুলির একটি জুড়ি নির্দিষ্ট করতে চান।
std::tuple<>
হয় এছাড়াও টাইপ-নিরাপদ (? কিভাবে এটা হতে পারে না), এবং 2
এর চেয়ে শব্দার্থিক ভাবে ভিন্ন pair
।
এটির মূল্য কী, তার জন্য আমি স্টাড :: টিপলের জিডিবি আউটপুটটি পড়তে অনেক বেশি কঠিন বলে মনে করি। স্পষ্টতই যদি আপনার আরও 2 টিরও বেশি মান প্রয়োজন হয় তবে std :: জোড়া কাজ করবে না, তবে আমি এটিকে স্ট্রাক্টের পক্ষে মনে করি।
std::get<0>(tupleName)
একটি গেটরে গ্রস লাইনটি জড়ান; GetX()
পড়া এবং খাটো করা অনেক সহজ। এটি একটি ছোট অসুবিধা হল যে আপনি এটি একটি করতে ভুলে গেলে হয়েছে const
পদ্ধতি কেউ কিছু ভালো মূঢ় করতে পারেন: GetX() = 20;
।
.first
এবং কার্যকর.second
, তারা কোনও কোডের পরিবর্তনে তৃতীয় (বা আরও) সদস্য (গুলি) প্রয়োজন হলে কোনও সহায়তা দেয় না। আমি লক্ষ্য করেছি যে আমিstd::get
যে কোনও গেইটারে নির্বিশেষে ব্যবহার করার প্রবণতা রেখেছি যেহেতু আমার সবকিছু পরিবর্তন করার দরকার নেই, কেবলমাত্র ডেটাটাইপস এবংmake_pair
কলগুলিতে কোনওmake_tuple
কল।