كتابة كود C/C++ بكفاءة في البرمجة التنافسية

أولا وقبل كل شيء تحتاج إلى معرفته نموذج وحدات الماكرو و المتجهات قبل الانتقال إلى المرحلة التالية! 

  • القوالب هي أساس البرمجة العامة التي تتضمن كتابة التعليمات البرمجية بطريقة مستقلة عن أي نوع معين.
  • الماكرو هو جزء من التعليمات البرمجية التي تم تسميتها باسم. كلما تم استخدام الاسم يتم استبداله بمحتويات الماكرو.
  • المتجهات هي نفس المصفوفات الديناميكية مع القدرة على تغيير حجم نفسها تلقائيًا عند إدراج عنصر أو حذفه مع معالجة تخزينها تلقائيًا بواسطة الحاوية.


حتى نتمكن من استخدام هذه الأدوات القوية لكتابة التعليمات البرمجية الخاصة بنا بطريقة فعالة.
فيما يلي بعض الحيل الرائعة التي يمكن استخدامها في البرمجة التنافسية: 

    باستخدام النطاق القائم على الحلقة : هذه ميزة رائعة جدًا في C++ 11 وستعتبر الأفضل إذا كنت تريد التكرار من البداية إلى النهاية. يوضح هذا الكود كيفية استخدام حلقات للتكرار من خلال مصفوفة ومتجه: 
CPP
   // C++ program to demonstrate range based for   // loops for accessing vector and array elements   #include       #include         using     namespace     std  ;   int     main  ()   {      // Create a vector object that      // contains 5 elements      vector   <  int  >     vec     =     {  0       1       2       3       4  };      // Type inference by reference using auto.      // Range based loops are preferred when no      // modification is needed in value      for     (  const     auto     &  value     :     vec  )      cout      < <     value      < <     ' '  ;      cout      < <     'n'  ;      // Basic 5 element integer array      int     array  []  =     {  1       2       3       4       5  };      for     (  const     auto     &  value  :     array  )      cout      < <     value      < <     ' '  ;      return     0  ;   }   

الإخراج:

0 1 2 3 4 1 2 3 4 5 
    قائمة التهيئة: يُستخدم هذا النوع للوصول إلى القيم الموجودة في قائمة تهيئة C++. هنا يتم إنشاء الكائنات من هذا النوع تلقائيًا بواسطة المترجم من إعلانات قائمة التهيئة وهي قائمة من العناصر المفصولة بفواصل والمحاطة بأقواس. 
CPP
   #include       template   <  typename     T  >   void     printList  (  std  ::  initializer_list   <  T  >     text  )   {      for     (  const     auto     &     value  :     text  )      std  ::  cout      < <     value      < <     ' '  ;   }   // Driver program   int     main  ()   {      // Initialization list      printList  (     {  'One'       'Two'       'Three'  }     );      return     0  ;   }   

الإخراج: 

One Two Three 
    تعيين القيمة القصوى أو الدنيا: هذا مفيد لتجنب الجهد الإضافي في كتابة دالة max() أو min(). 
CPP
   #include       // Call by reference is used in x   template   <  typename     T       typename     U  >   static     inline     void     amin  (  T     &  x       U     y  )   {      if     (  y      <     x  )      x     =     y  ;   }   // call by reference is used in x   template   <  typename     T       typename     U  >   static     inline     void     amax  (  T     &  x       U     y  )   {      if     (  x      <     y  )      x     =     y  ;   }   // Driver program to find the Maximum and Minimum value   int     main  ()   {      int     max_val     =     0       min_val     =     1e5  ;      int     array  []  =     {  4       -5       6       -9       2       11  };      for     (  auto     const     &  val  :     array  )      // Same as max_val = max (max_val val)      // Same as min_val = min (min_valval)      amax  (  max_val       val  )     amin     (  min_val       val  );      std  ::  cout      < <     'Max value = '      < <     max_val      < <     '  n  '       < <     'Min value = '      < <     min_val  ;      return     0  ;   }   

الإخراج:

Max value = 11 Min value = -9 
    الإدخال والإخراج السريع في C/C++: في البرمجة التنافسية، يجب عليك قراءة الإدخال/الإخراج بأسرع ما يمكن لتوفير الوقت الثمين. 
C
   #include          template   <  typename     T  >     void     scan  (  T     &  x  )   {      x     =     0  ;      bool     neg     =     0  ;      register     T     c     =     getchar  ();      if     (  c     ==     '-'  )      neg     =     1       c     =     getchar  ();      while     ((  c      <     48  )     ||     (  c     >     57  ))      c     =     getchar  ();      for     (     ;     c      <     48  ||  c     >     57     ;     c     =     getchar  ());      for     (     ;     c     >     47     &&     c      <     58  ;     c     =     getchar  ()     )      x  =     (  x      < <     3  )     +     (     x      < <     1     )     +     (     c     &     15     );      if     (  neg  )     x     *=     -1  ;   }   template   <  typename     T  >     void     print  (  T     n  )   {      bool     neg     =     0  ;      if     (  n      <     0  )      n     *=     -1       neg     =     1  ;      char     snum  [  65  ];      int     i     =     0  ;      do      {      snum  [  i  ++  ]     =     n     %     10     +     '0'  ;      n     /=     10  ;      }      while     (  n  );      --  i  ;      if     (  neg  )      putchar  (  '-'  );      while     (  i     >=     0  )      putchar  (  snum  [  i  --  ]);      putchar  (  'n'  );   }   // Driver Program   int     main  ()   {      int     value  ;      // Taking input      scan  (  value  );      // Printing output      print  (  value  );      return     0  ;   }   
Input: 756 Output: 756 

لمعرفة المزيد عن سرعة الإدخال والإخراج اقرأ هذا المقال . 

    استخدام وحدات الماكرو كحلقة : ربما لن يكون من الجيد استخدام وحدات الماكرو هذه لأنها ستقلل من إمكانية قراءة التعليمات البرمجية ولكن لكتابة تعليمات برمجية سريعة يمكنك تحمل هذه المخاطرة! 
CPP
   #include          using     namespace     std  ;   #define rep(in) for (i = 0; i  < n; ++i)   #define REP(ikn) for (i = k; i  <= n; ++i)   #define REPR(ikn) for (i = k; i >= n; --i)   // Driver program to test above Macros   int     main  ()   {      int     i  ;      int     array  []     =     {  4       5       6       9       22       11  };      int     size  =     sizeof  (  array  )  /  sizeof  (  array  [  0  ]);          // Default 0 index based loop      rep  (  i       size  )         cout      < <     array  [  i  ]      < <     ' '  ;      cout   < <  '  n  '  ;          // Starting index based loop      REP  (  i       1       size  -1  )         cout      < <     array  [  i  ]      < <     ' '  ;      cout   < <  '  n  '  ;          // Reverse for loop      REPR  (  i       size  -1    0  )         cout      < <     array  [  i  ]      < <     ' '  ;      return     0  ;   }   

الإخراج  

4 5 6 9 22 11 5 6 9 22 11 11 22 9 6 5 4 
    باستخدام "bits/stdc++.h": بدلاً من إضافة الكثير من خطوط #include، استخدم فقط #include تتضمن الملفات جميع ملفات الرأس التي ستحتاجها في البرمجة التنافسية مما يوفر الكثير من وقتك. الحاويات: إن استخدام حاويات مختلفة مثل خريطة قائمة المتجهات وما إلى ذلك يمكّن الشخص من استخدام الوظائف المحددة مسبقًا ويقلل حجم الكود إلى حد كبير (في أغلب الأحيان) سين وكوت سريع: إذا كنت تستخدم cin وcout للإدخال/الإخراج، فما عليك سوى إضافة السطر التالي بعد main() مباشرةً. 
std::ios_base::sync_with_stdio(false); 
    آلي: يمكن أن يؤدي استخدام تلقائي للإعلان عن أنواع البيانات إلى توفير الكثير من الوقت أثناء مسابقات البرمجة. عندما يتم تعريف متغير كمترجم تلقائي يحدد نوعه أثناء وقت الترجمة. المكتبات والوظائف المحددة مسبقًا: استخدام وظائف مدمجة مثل __gcd(AB) المبادلة _builtin_popcount(R) _builtin_clz(R) وما إلى ذلك أينما يمكن تطبيق ذلك. حاول أن تتعلم الوظائف المختلفة المتوفرة في خوارزمية مكتبة C++. فهي مفيدة في معظم الأوقات في البرامج


في النهاية، باستخدام هذه الحيل الذكية، يمكنك بسهولة كتابة التعليمات البرمجية في أقل قدر ممكن من الوقت والكلمات.

إنشاء اختبار