معامل المقارنة ثلاثية الاتجاه في C++20
استخدم معامل سفينة الفضاء لإجراء مقارنات موجزة ومتسقة.
معامل المقارنة ثلاثية الاتجاه في C++20 درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
معامل المركبة الفضائية <=>
قدّم C++20 معامل المقارنة ثلاثي الاتجاهات <=>. ويوفّر معامل واحد للمصرّف كل ما يحتاج إليه لتوليد معاملات العلاقات الستة.
أنواع الإرجاع: ثلاث فئات
يعتمد نوع الإرجاع على قوة الترتيب:
std::strong_ordering— قيم متكافئة يمكن تمييزهاstd::weak_ordering— قيم متكافئة لكنها قابلة للتمييز (مثل المقارنة غير الحساسة لحالة الأحرف)std::partial_ordering— بعض القيم غير قابلة للمقارنة (مثل NaN)
المقارنة الافتراضية
النمط الأكثر شيوعًا هو أن تطلب من المصرّف توليد <=> عبر مقارنة الأعضاء ترتيبًا معجميًا.
struct Point {
int x;
int y;
auto operator<=>(const Point& other) const = default;
};
Point a{1, 2}, b{1, 3};
bool less = (a < b); // true — auto-generatedالمعاملات الستة مجانًا
يؤدي جعل <=> افتراضيًا إلى جعل == افتراضيًا أيضًا. ومعًا، يولّدان != و< و<= و> و>= — أي المعاملات الستة في سطر واحد.
تطبيق مخصص لـ <=>
اكتب جسم الدالة يدويًا لتنفيذ منطق مقارنة مخصص.
std::strong_ordering operator<=>(const Person& other) const {
if (auto c = name <=> other.name; c != 0) return c;
return age <=> other.age;
}استخدام النتيجة
يمكن مقارنة نتيجة <=> بالقيمة الحرفية 0 لإجراء فحص القيمة المنطقية المطلوب فعليًا.
if ((a <=> b) < 0) std::cout << "a less\n";
if ((a <=> b) == 0) std::cout << "equal\n";
if ((a <=> b) > 0) std::cout << "a greater\n";الأعداد العشرية وpartial_ordering
بالنسبة إلى الأعداد العشرية، استخدم std::partial_ordering للتعامل مع NaN — إذ تؤدي المقارنة مع NaN إلى unordered.
struct Measurement {
double value;
std::partial_ordering operator<=>(const Measurement&) const = default;
};مثال على الترتيب الضعيف
استخدم الترتيب الضعيف عندما تكون القيم قابلة للتمييز لكنها تتساوى عند المقارنة — مثل السلاسل النصية غير الحساسة لحالة الأحرف.
تخصيص == بشكل مستقل
يمكنك جعل <=> افتراضيًا وكتابة == مخصص — ففي بعض الأحيان تكون لقواعد التساوي قواعد مختلفة عن قواعد الترتيب.
ترحيل الشيفرة القديمة
إذا كان لصنفك سابقًا عدد كبير من معاملات المقارنة، فاستبدلها بـ <=> افتراضي عند الترحيل إلى C++20. شيفرة أقل بكثير، مع الحفاظ على الدلالات نفسها.
متى لا تستخدم <=>
بالنسبة إلى الأنواع التي يهم فيها التساوي فقط (من دون ترتيب)، وفّر operator== وoperator!= فقط، إذ يُولَّد الأخير تلقائيًا في C++20.
ملاحظة حول الأداء
قد يحسّن المصرّف <=> الافتراضي بالكفاءة نفسها التي تحققها مقارنات مكتوبة يدويًا. ولا توجد تكلفة إضافية وقت التشغيل عند استخدام معامل المركبة الفضائية.
اختبار سريع
أي فئة إرجاع ينبغي استخدامها للمقارنة بين أنواع الأعداد العشرية التي قد تحتوي على NaN؟
مراجعة
يولّد معامل <=> في C++20 معاملات العلاقات الستة من تعريف واحد. اجعله افتراضيًا لمقارنة الأعضاء ترتيبًا معجميًا. واختر الترتيب القوي أو الضعيف أو الجزئي بناءً على دلالات نوعك.
الأسئلة الشائعة
هل درس «معامل المقارنة ثلاثية الاتجاه في C++20» مجاني؟
نعم — نص درس «معامل المقارنة ثلاثية الاتجاه في C++20» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «معامل المقارنة ثلاثية الاتجاه في C++20»؟
استخدم معامل سفينة الفضاء لإجراء مقارنات موجزة ومتسقة. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «معامل المقارنة ثلاثية الاتجاه في C++20»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- معاملات الحساب والمقارنة
- معاملات الإدراج والاستخراج من التدفق
- معاملات الفهرسة واستدعاء الدوال
- معامل المقارنة ثلاثية الاتجاه في C++20