কেবলমাত্র দুটি সদস্যের সাথে কি একটি 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কল।