כתיבת קוד 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 עבור I/O פשוט הוסף את השורה הבאה מיד אחרי ה-main(). 
std::ios_base::sync_with_stdio(false); 
    אוטומטי: שימוש באוטו כדי להכריז על סוגי נתונים יכול לחסוך זמן רב במהלך תחרויות תכנות. כאשר משתנה מוגדר כקומפיילר אוטומטי קובע את סוגו במהלך זמן ההידור. ספריות ופונקציות מוגדרות מראש: שימוש בפונקציות מובנות כגון __gcd(AB) החלפת _builtin_popcount(R) _builtin_clz(R) וכו' בכל מקום שניתן ליישם זאת. נסה ללמוד פונקציות שונות הזמינות ב אַלגוֹרִיתְם ספריית C++. הם שימושיים רוב הפעמים בתוכניות


בסופו של דבר, באמצעות הטריקים החכמים האלה, אתה יכול בקלות לכתוב קוד במינימום זמן ומילים.

צור חידון