মাত্র দুটি সদস্যের সাথে স্টাড :: জোড় এবং এসটিডি :: দ্বিগুণ?


92

কেবলমাত্র দুটি সদস্যের সাথে কি একটি std::pairএবং এর মধ্যে পার্থক্য রয়েছে std::tuple? (স্পষ্টতই std::pairদু'জন এবং মাত্র দু'জন সদস্যের প্রয়োজন রয়েছে এবং এর tupleকম-বেশি থাকতে পারে ...)

উত্তর:


86

কিছু পার্থক্য রয়েছে:

  1. std::tupleস্ট্যান্ডার্ড-লেআউট দ্বারা কখনই হতে পারে না (কমপক্ষে, এটি স্ট্যান্ডার্ডের দ্বারা আবশ্যক নয় )। প্রতিটি std::pair<T, Y>উভয় মান-বিন্যাস Tএবং Yমান-বিন্যাস হয়।

  2. এটির pairচেয়ে একটি এর সামগ্রীর প্রাপ্তি কিছুটা সহজ tuple। ক্ষেত্রে আপনাকে একটি ফাংশন কল ব্যবহার করতে হবে tuple, যখন pairকেসটি কেবল একটি সদস্য ক্ষেত্র।

কিন্তু এটি সম্পর্কে।


4
"টুপলের চেয়ে জোড়ের থেকে ডেটা বের করা কিছুটা সহজ A কিছুটা" " আমি লক্ষ্য করেছি. : পি যদিও সজ্জিত .firstএবং কার্যকর .second, তারা কোনও কোডের পরিবর্তনে তৃতীয় (বা আরও) সদস্য (গুলি) প্রয়োজন হলে কোনও সহায়তা দেয় না। আমি লক্ষ্য করেছি যে আমি std::getযে কোনও গেইটারে নির্বিশেষে ব্যবহার করার প্রবণতা রেখেছি যেহেতু আমার সবকিছু পরিবর্তন করার দরকার নেই, কেবলমাত্র ডেটাটাইপস এবং make_pairকলগুলিতে কোনও make_tupleকল।
কেসি

এটি প্রদর্শিত হয় যা সি ++ 11 তে এমনকি হিসাবে std::mapব্যবহার std::pair<const Key,T>করে value_type। টিপলসটি ঠিক কোথায় ব্যবহৃত হয় std::map?
রাত ১১ ই

@ নাইটনাট: ... কেন আমি এটা বলেছিলাম তা আমার কোনও ধারণা নেই। বা পরিবর্তে আমি বলতে চাইছি কি std::map
নিকল বোলাস

4
@ ইয়াক্ক: উম, আমি "চাপলাম"। এবং আমার আইডিই সদস্যদের একটি তালিকা উপস্থিত করে। আমি মনে করি না যে লোকেরা বানানটির প্রয়োজন হবে।
নিকল বোলাস

4
আমি ভাবছি যদি সি ++ 17 এর কাঠামোগত বাঁধাই ইতিমধ্যে এই উত্তরটির 1 এবং 2 পয়েন্ট উভয়কেই অবৈধ করে? যদি তা হয় তবে দয়া করে এটির একটি সি ++ 17 সংস্করণ যুক্ত করুন।
স্যান্ডথর্ন

29

এটি একটি খুব দেরিতে উত্তর তবে নোট করুন যেহেতু std::pairসদস্য ভেরিয়েবলগুলির সাথে সংজ্ঞায়িত হয়েছে, খালি বেস শ্রেণীর অপ্টিমাইজেশন ব্যবহার করে এর আকারটি অনুকূলিত করা যায় না ( firstএবং secondঅবশ্যই একটি বা উভয়ই শূন্য শ্রেণীর হলেও পৃথক ঠিকানা দখল করতে হবে)। এটি প্রান্তিককরণের যা কিছু প্রয়োজনীয়তা second_typeরয়েছে তার দ্বারা বর্ধিত , সুতরাং সবচেয়ে খারাপ ক্ষেত্রে ফলাফলটি std::pairমূলত এটির আকারের দ্বিগুণ হবে।

std::tupleকেবল সহায়ক ফাংশনগুলির মাধ্যমে অ্যাক্সেসের অনুমতি দেয়, সুতরাং এক বা অন্যটি খালি থাকলে ওভারহেডে সঞ্চয় করে উভয় প্রকারের থেকে পাওয়া সম্ভব। খুব অন্তত জিসিসি বাস্তবায়ন, স্পষ্টভাবে এই আছে ... এই যাচাই করতে হেডার মাধ্যমে অকর্মা পারে, তেমনই আছে এই প্রমাণ হিসাবে।


4
অবশ্যই, সি ++ 20[[no_unique_address]]std::pair এর অসুবিধা অপসারণ করা উচিত ।
উত্সাহক

"std :: tuple কেবল সহায়ক ফাংশনগুলির মাধ্যমে অ্যাক্সেসের অনুমতি দেয়", বা সি ++ 17 কাঠামোগত বাইন্ডিংগুলি। দুঃখের বিষয় যে এতগুলি যুক্তিসঙ্গত সি ++ উত্তরগুলি আজকাল এত দ্রুত পুরানো। :-(
cosimo193

29

একটি std::tupleনাম দীর্ঘ (একটি অতিরিক্ত চরিত্র)। এই চরিত্রগুলির মধ্যে অনেকগুলি ডান হাতে টাইপ করা হয়েছে, বেশিরভাগ লোকের পক্ষে টাইপ করা এত সহজ।

এটি বলেছিল, std::pairকেবল দুটি মান থাকতে পারে - শূন্য নয়, এক, তিন বা আরও বেশি। দুটি মান। একটি টিপল, তবে মানগুলির সংখ্যার উপর প্রায় কোনও শব্দার্থিক সীমাবদ্ধতা নেই। একটি std::pair, তাই, ব্যবহারের জন্য আরও সঠিক, প্রকারের নিরাপদ প্রকারটি যদি আপনি প্রকৃতপক্ষে মানগুলির একটি জুড়ি নির্দিষ্ট করতে চান।


20
হাঃ হাঃ হাঃ! আপনি কীভাবে টাইপ করা যায় তা বিবেচনা করে উজ্জ্বল! আমি উল্লেখ করতে চাই যদিও আমি সম্ভবত 'টিপল' এর চেয়ে 20% এরও বেশি দ্রুত 'জোড়া' টাইপ করি। এটি কারণ আমার হাতগুলি প্রতিটি অক্ষরকে বিকল্পভাবে টাইপ করে। আরএইচএস: পি, এলএইচএস: এ, আরএইচএস: আই, এলএইচএস: আর। কমপক্ষে আমার জন্য আমি এটি করা সহজ খুঁজে পেয়েছি! - তবে আপনি এখনও +1 পান!
রিচার্ড কর্ডেন

15
" সুতরাং একটি স্টাড :: জোড় হ'ল আরও নির্ভুল, প্রকারের নিরাপদ প্রকারটি ব্যবহার করতে চাইলে আপনি যদি সত্যই কোনও জোড় মানকে নির্দিষ্ট করতে চান। " এটি বেশি টাইপ-সেফ বা "নির্ভুল" নয়, এটি কেবল (যুক্তিযুক্ত) সংকেত উদ্দেশ্য আরও সরাসরি।
iljarn

4
@Arafangion: std::tuple<>হয় এছাড়াও টাইপ-নিরাপদ (? কিভাবে এটা হতে পারে না), এবং 2এর চেয়ে শব্দার্থিক ভাবে ভিন্ন pair
iljarn

4
" সুতরাং একটি স্ট্যান্ড :: জোড় ব্যবহার করার জন্য আরও সঠিক, টাইপ নিরাপদ টাইপ " এবং আমি মনে করি যে কোনও ইংরেজী স্পিকার 'জোড়' এবং 'দু'টিকে সম্পূর্ণ সমার্থক হিসাবে ভাবেন। : -]
iljarn

4
@ জিলজাম: আমরা এখানে কেশ বিভক্ত করছি, তবে না, তারা সম্পূর্ণ সমার্থক নয়। আপনি যখন "দুটি জুতা" বলছেন, তখন আপনার অর্থ কি "দুটি জুতা, যা উভয়ই বাম জুতা হতে পারে", বা আপনার অর্থ "একজোড়া জুতা" (যার মধ্যে একটি সর্বদা বাম এবং অন্যটি সর্বদা ডান থাকে) ?
আরাফ্যাঙ্গিয়ন

9

নোট করুন যে সি ++ 17 এর সাথে, উভয় থেকে ডেটা পড়তে একই ইন্টারফেস ব্যবহার করতে পারেন এবং দুটি উপাদানগুলির সাথে টিপল করতে পারেন।

auto [a, b] = FunctionToReturnPairOrTuple();

ব্যবহার করার দরকার নেই get<>:)


3

এটির মূল্য কী, তার জন্য আমি স্টাড :: টিপলের জিডিবি আউটপুটটি পড়তে অনেক বেশি কঠিন বলে মনে করি। স্পষ্টতই যদি আপনার আরও 2 টিরও বেশি মান প্রয়োজন হয় তবে std :: জোড়া কাজ করবে না, তবে আমি এটিকে স্ট্রাক্টের পক্ষে মনে করি।


এই কারণেই যখন আমি তাদের ক্লাসে ব্যবহার করি তখন আমি std::get<0>(tupleName)একটি গেটরে গ্রস লাইনটি জড়ান; GetX()পড়া এবং খাটো করা অনেক সহজ। এটি একটি ছোট অসুবিধা হল যে আপনি এটি একটি করতে ভুলে গেলে হয়েছে constপদ্ধতি কেউ কিছু ভালো মূঢ় করতে পারেন: GetX() = 20;
কেসির
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.