কেন “বি <ক ব্যবহার করবেন? a: b ”এর পরিবর্তে“ a <b? বি: একটি "সর্বাধিক টেম্পলেট কার্যকর করতে?


154

সি ++ টেম্পলেটগুলি - সম্পূর্ণ গাইড, ২ য় সংস্করণ সর্বাধিক টেমপ্লেটটি উপস্থাপন করেছে :

template<typename T>
T max (T a, T b)
{
  // if b < a then yield a else yield b
  return  b < a ? a : b;
}

এবং এটি এর “b < a ? a : b”পরিবর্তে ব্যবহার করে ব্যাখ্যা করে “a < b ? b : a”:

মনে রাখবেন যে [স্টেপেনভ নোটস] অনুসারে সর্বাধিক () টেমপ্লেট ইচ্ছাকৃতভাবে "বি <a? a: b ”এর পরিবর্তে“ a <b? বি: একটি "দুটি মান সমান হলেও সমান না হলেও ফাংশনটি সঠিকভাবে আচরণ করে তা নিশ্চিত করতে।

" even if the two values are equivalent but not equal." কিভাবে বুঝবেন ? “a < b ? b : a”আমার জন্য একই ফলাফল আছে বলে মনে হয়।


8
সৌন্দর্য আমাকে ভুল ... উভয় উত্তর "সঠিক" তবে যদি aএবং bহয় সমতুল্য , তারপর !(a < b) && !(b < a)সত্য, তাই a < bএবং b < aউভয় মিথ্যা, তাই b < a ? a : b, bযা নয় কি আপনি চান ... আপনি চান ফিরিয়ে দেওয়া হয়, a < b ? b : a
হলট

1
আপনি প্রায়শই সমতুল্য aএবং এর bসাথে পার্থক্য করতে পারেন std::addressof। অল।
কালেথ

14
আপনি যদি a = max(a, b);(বারবার) করেন তবে আপনি aঅকারণে প্রতিস্থাপন করতে চাইবেন না ।
বো পারসন

2
বিটিডব্লিউ এই টেমপ্লেটটি কনস্ট-রেফারেন্সের মাধ্যমে প্যারামিটারগুলি নেওয়া উচিত এবং কনস্ট-রেফারেন্সের মাধ্যমে সেগুলি ফিরিয়ে দেওয়া উচিত, অন্যথায়, আপনি অকেজো অনুলিপিগুলি করছেন (এবং আপনি aএকটি অনুলিপি দিয়ে ওভাররাইড করতে যাচ্ছেন a)।
হল্ট

3
@ ক্যালথ: ক্যানোনিকাল টাইপের মধ্যে সমতা এবং সমতা উভয়ই হ'ল কেস-সংবেদনশীল স্ট্রিং। এই ধরণের জন্য, একটি <ক বা এ <একটি নয়। তবে std::addressofএটি অপ্রাসঙ্গিক। আসলে, প্রদত্ত জন্য T max(T a, T b)আমরা ইতিমধ্যে জানি addressof(a) != addressof(b)
এমএসএলটাররা

উত্তর:


150

std::max(a, b)aদু'টি সমতুল্য হলে প্রকৃতপক্ষে প্রত্যাবর্তন নির্দিষ্ট করা হয়েছে ।

এটি স্টেপানভ এবং অন্যদের একটি ভুল হিসাবে বিবেচিত হয়েছে কারণ এটি প্রদত্ত দরকারী সম্পত্তিকে ভঙ্গ করে aএবং bআপনি সর্বদা সেগুলি বাছাই করতে পারেন {min(a, b), max(a, b)}; তার জন্য, আপনি যুক্তিগুলির সমতুল্য হলে max(a, b)ফিরে আসতে চাই tob


48
এই লিঙ্কটি থেকে "যারা এমন কাজ করে তাদের দোষ দেওয়া আমার পক্ষে কঠিন: সর্বোপরি, তারা কেবল আমার লেখা সর্বোচ্চের সি ++ স্ট্যান্ডার্ড স্পেসিফিকেশন অনুসরণ করে I আমার ভুল হয়েছে কিনা তা দেখতে কয়েক বছর সময় লেগেছে।" - কি দারুন!
জ্যাক এইডলি

23
তুমি কি পারবে না {min(a, b), max(b, a)}?
ক্যাপ্টেন ম্যান

12
@ ক্যাপিটেনম্যান: হ্যাঁ, তবে এটি এখনও কম স্পষ্ট। আমি যুক্তি দিয়ে বলব যে এটি যৌক্তিক অর্থে তৈরি করে যা max(a,b)যদি কেবলমাত্র এবং যদি min(a,b)বি প্রদান করে তবে, বিপরীতে যাতে তারা একে অপরের বিপরীত হয় এবং (বিন্যস্ত) সেটটি {min(a,b), max(a,b)}সর্বদা সমান হয় {a,b}
জ্যাক এইডলি

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

2
@ সুপের্যাট আবেদন করা minএবং সেই দৃশ্যের টাইমস্ট্যাম্প (সাজানোর কী) ব্যতীত maxঅন্য কোনও কিছুর অর্থ নেই। সাম্য যদি আদান-প্রদানের বিষয়টি বোঝায় না তবে ইভেন্টগুলি (বস্তুগুলি) তাদের তুলনাযোগ্যও হওয়া উচিত নয়। একমাত্র উপায় তোলে কোনো হিসাবে কেমন প্রক্রিয়া হলে বস্তু বিনিমেয় অর্থে। {min(a, b), max(a, b)}
jpmc26

62

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

একটি প্রাসঙ্গিক ব্যাখ্যার জন্য @ টিসির উত্তর দেখুন ।


মানটি std::max(a, b)নিম্নলিখিত অনুসারে সংজ্ঞায়িত করে [alg.min.max] (জোর আমার)

template<class T> constexpr const T& max(const T& a, const T& b);

প্রয়োজনীয় : টাইপ টি কম থ্যাংকম্পারেবল (সারণী 18)।

আয় : বৃহত্তর মান।

মন্তব্যসমূহ : তর্কগুলি সমতুল্য হলে প্রথম যুক্তিটি দেয়।

এখানে সমান অর্থ !(a < b) && !(b < a)হল true [alg.sorting # 7]

বিশেষ করে, যদি aএবং bসমতুল্য, উভয় a < bএবং b < aহয় false, তাই ডানদিকে মান :শর্তসাপেক্ষ অপারেটর ফিরে যেতে হবে, তাই a, তাই ডান দিকে ফিরে আসে:

a < b ? b : a

... সঠিক উত্তর বলে মনে হচ্ছে। এটি libstdc ++ এবং libc ++ দ্বারা ব্যবহৃত সংস্করণ ।

সুতরাং আপনার উক্ত তথ্যটি বর্তমান মান অনুযায়ী ভুল বলে মনে হচ্ছে তবে এটি যে প্রসঙ্গে এটি সংজ্ঞায়িত হয়েছে তা ভিন্ন হতে পারে।


4
গডবোল্ট লিঙ্কটি এই সমস্যাটি ব্যাখ্যা করে (সংজ্ঞায়িত করার জন্য @ সিংগুয়ানিয়ানো ধন্যবাদ X)।
হলট

1
@ জ্যাকএইডলি যুক্তিটি বর্তমান মানকে লক্ষ্য করে তা নির্দিষ্ট করতে আমি উত্তর সম্পাদনা করেছি।
হল্ট

@ কোডেজার আমি আসলে "আমরা যদি সম ((ক, খ) কে কমপ (ক, ক) এবং& কম্প (বি, এ)" হিসাবে সংজ্ঞায়িত করি তবে " উল্লেখ করছি " । আমি লিঙ্কটি আরও ভাল উদ্ধৃতিতে পরিবর্তন করেছি (মান নীচে 3 লাইন ...)।
হল্ট

1
অবাক বিস্মিত কেউ ভাসমান পয়েন্টটি উল্লেখ করেন নি, যেখানে a<bএবং b<aউভয়ই মিথ্যা হতে পারে কারণ তারা আনর্ডারড রয়েছে (এক বা উভয় এনএএন, সুতরাং ==এটিও মিথ্যা)। এটি এক ধরণের সমতা হিসাবে দেখা যেতে পারে। আলগাভাবে সম্পর্কিত: x86 এর maxsd a, bনির্দেশিকা বাস্তবায়ন a = max(b,a) = b < a ? a : b। ( কোন নির্দেশনা যা শাখাবিহীন এফপি মিনিট এবং x86 এ সর্বোচ্চ দেয়? ) নির্দেশটি সোর্স অপারেন্ডকে (২ য় এক) আনর্ডার্ডে রাখে, তাই কোনও অ্যারে থাকলে একটি অ্যারের উপরে একটি লুপ আপনাকে NaN দেবে। কিন্তু max_seen = max(max_seen, a[i])NaNs উপেক্ষা করবে।
পিটার কর্ডেস


21

বিন্দুটি হ'ল তারা যখন সমতুল্য হয় তখন কোনটি ফিরিয়ে দেওয়া উচিত; এই মামলার জন্য std::maxফিরে আসতে হবে a(অর্থাত্ প্রথম যুক্তি)।

তারা সমতুল্য হলে, ফেরত a

তাই a < b ? b : aব্যবহার করা উচিত; অন্যদিকে, ভুলভাবে b < a ? a : b;ফিরে আসবে b

(@ হোল্ট যেমন বলেছিলেন, উদ্ধৃতিটি বিপরীত বলে মনে হচ্ছে))

"দুটি মান সমান তবে সমান নয়" এর অর্থ তুলনা করার সময় তাদের একই মান থাকে তবে তারা অন্য কিছু দিক থেকে ভিন্ন ভিন্ন বস্তুতে স্থানান্তরিত হয়।

যেমন

struct X { int a; int b; };
bool operator< (X lhs, X rhs) { return lhs.a < rhs.a; }
X x1 {0, 1};
X x2 {0, 2};
auto x3 = std::max(x1, x2); // it's guaranteed that an X which cantains {0, 1} is returned

1
আপনি কি দয়া করে এখানে std::max(a, b)ফিরে আসতে হবে a, যদি aএবং bসমতুল্য হন তবে বিস্তারিত জানাতে পারেন ?
り ネ ロ ク


এটা কি শুধু আমি নাকি এই প্রশ্নের সাথে বিরোধী? যদি aএবং bসমান হয়, তাহলে !(a < b) && !(b < a)সত্য, তাই a < bএবং b < aমিথ্যা, তাই ...?
হল্ট

2
@ ネ ロ ク আমি মনে করি মানকটি কেবল এটি নির্ধারণ করতে চায়; যখন তারা সমান হয় তবে কোনটি ফেরত দেওয়া উচিত।
গানয়ুয়ানায়াও

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