Чому C ++ переважає у конкурсах та змаганнях з програмування? [зачинено]


23

Я розумію, що C ++ є дуже швидкою мовою, але хіба це не так швидко, чи в деяких випадках швидше?

Тоді ви можете сказати, що C ++ має OOP, але кількість OOP, яка вам потрібна для більшості головоломок програмування, не така вже й велика, і, на мою думку, C міг би це впоратися.

Ось чому я запитую це : мене дуже цікавлять конкурси програмування та змагання, і я звик кодувати в C на них. Однак я помітив, що переважна більшість людей використовує C ++ (наприклад, 17 з 25 фіналістів у Google Code Jam 2011 використовували його, а ніхто не використовував C), тому мені цікаво, чи зіткнувся я з C.

Крім об'єктної орієнтації, що робить C ++ більш підходящою мовою для змагань з програмування? Які особливості мови я повинен вивчити та використовувати, щоб краще виступати на змаганнях?

З іншого боку, я вважаю себе досить знаючим C, але я тільки починаю вивчати C ++.

Відповіді:


56

Для початку завжди будуть проблеми, які краще вирішити однією мовою, ніж іншою. Завжди знайдуться мови, які вирішують конкретні проблеми "краще", ніж будь-яка інша мова, для певного визначення "кращого". Однак дуже велика кількість проблем має дуже схожі потреби (деякі введення / виведення, деякі обчислення) і перед ними схожі вимоги (розумна надійність, розумна ефективність).

Як ви вже знаєте C, для переважної більшості проблем, які там знаходяться, я констатую, що C ++ не забезпечує суттєвих недоліків та низку значних поліпшень. Сміливий? Деякі люди, здається, так вважають, але це дійсно так. Почнемо з очищення кількох дуже поширених непорозумінь C ++:

  • C ++ повільніше, ніж C. Неправильно! Багато програм C також є дійсними програмами C ++ - і така програма C повинна працювати з однаковою швидкістю, коли вона компілюється з компілятором C або компілятором C ++.

  • Спеціальні функції C ++ вимагають великих витрат. Неправильно! Так звані накладні витрати, запроваджені певними специфічними функціями C ++ (такими як виклики віртуальних функцій або винятки), можна порівняти з накладними накладними витратами, які ви самі ввели, якби застосувати подібну функцію в C.

  • C ++ - об'єктно-орієнтована. Неправильно! Мова C ++ містить деякі розширення мови, що полегшують об'єктно-орієнтоване програмування та загальне програмування. C ++ нікуди не змушує об'єктно-орієнтованого дизайну - це просто дозволяє. C також дозволяє об'єктно-орієнтоване програмування, C ++ лише робить його більш простим і менш схильним до помилок.

Отже, якщо ви мені вірите, ми встановили, що "C ++ не є значно гіршим за C". Давайте подивимось, що робить C ++ кращим C:

  • Більш сильне введення Система типів у C ++ є сильнішою, ніж у C. Це запобігає безлічі поширених помилок програмування - у поєднанні з наступною дуже важливою особливістю, сильніша система типу навіть не доставляє незручностей.

  • Параметризовані типи Ключове слово шаблону дозволяє програмісту писати загальні (типово-агностичні) реалізації алгоритмів. Якщо в C, можна написати загальну реалізацію списку з таким елементом:

    struct element_t {
      struct element_t *next, *prev;
      void *element;
     };

C ++ дозволяє написати щось на кшталт:

template <typename T>
struct element_t {
   element_t<T> *next, *prev;
   T element;
};

Реалізація C ++ не тільки запобігає поширеним помилкам програміста (наприклад, розміщення елемента неправильного типу у списку), але також дозволяє кращу оптимізацію компілятором! Наприклад, реалізація загального сортування доступна як для C, так і для C ++ -

порядок C визначається як:

void qsort(void *base, size_t nmemb, size_t size,
           int(*compar)(const void *, const void *));

тоді як програма C ++ визначається як

template void sort(RandomAccessIterator first, RandomAccessIterator last);

Різниця полягає в тому, що, наприклад, сортування масиву цілих чисел, у випадку С вимагає виклику функції для кожного порівнювання, тоді як реалізація C ++ дозволить компілятору вбудувати рядки викликів порівняння цілих чисел, оскільки фактична процедура сортування - це автоматично інстанціюється під час компіляції компілятором з правильними типами, вставленими в аргументи шаблону.

  • Більша стандартна бібліотека C ++ дозволяє повністю використовувати стандартну бібліотеку C. Це дуже важливо, звичайно, оскільки стандартна бібліотека С - це неоціненний ресурс при написанні реальних програм. Однак C ++ включає бібліотеку стандартних шаблонів. STL містить ряд корисних шаблонів, як, наприклад, звичайна процедура сортування вище. Вона включає в себе корисні загальні структури даних, такі як списки, карти, набори і т. Д. Як і порядок сортування, інші підпрограми STL та структури даних "підлаштовуються" під конкретні потреби програміста - все, що програміст повинен зробити, це заповнити типи.

Звичайно, STL - це не срібна куля, але вона дуже часто допомагає при вирішенні загальних проблем. Як часто ви реалізували список на С? Як часто RB-дерево було б кращим рішенням, якби тільки ви встигли це зробити? З STL вам не потрібно робити таких компромісів - використовуйте дерево, якщо воно краще підходить, це так само просто, як використовувати список.

Гаразд, тому я обговорював лише хороші частини. Чи є якісь недоліки? Звичайно, є. Однак їх кількість зменшується з кожним днем. Дозволь пояснити:

  • Немає хороших компіляторів C ++. Так було вже давно. Але ви повинні пам’ятати, що мова була стандартизована в 1998 році - це складна мова, більш складна, ніж C. Потрібно тривалий час, щоб укладачі досягли стандартного рівня. Але станом на цей текст є хороші компілятори, доступні для найбільш широко використовуваних платформ; GCC у версіях 3.X, як правило, дуже хороший, і він працює на GNU / Linux та більшості платформ UNIX. Intel має хороший компілятор для Win32 - він також досить хороший, але, на жаль, він все ще покладається на MS STL, який є підпунктом.

  • Люди не знають гарного C ++ Це не часто чутні скарги, але я бачу багато чого. C ++ - це велика і складна мова, але вона також була мовою, яка була багато роздуто, особливо ще в дні "ООП вирішує голод, виліковує СНІД та рак". Результатом здається, що багато справді поганого коду С ++, в основному поганого С, з кількома деклараціями класу тут і там, є там і використовується як навчальний матеріал. Це означає, що багато людей, які вважають, що вони знають, що C ++ насправді пишуть справді хитрий код. Це занадто погано, і це проблема, але я думаю, що це несправедливо звинувачувати в C ++.

Отже, єдині дві основні проблеми із C ++ - це результати C ++ як молодої мови. З часом вони зникнуть. І для більшості проблем там, якщо ви можете отримати хороших програмістів (або навчитися хорошому C ++ самостійно), сьогодні проблеми насправді не є проблемою.


8
+1. Дуже повна відповідь. Єдине, що я маю іншу думку, це те, що в майбутньому основні недоліки C ++ зникнуть. Оскільки C ++ має бути сумісним назад, майже не буде видалено мовних функцій із C ++, додаються лише нові (C ++ 11 - ідеальний приклад для цього). Це зробить мову ще складнішою, ніж сьогодні, що є IMHO найбільшим недоліком C ++.
Док Браун

@DocBrown: Це залежить від способу використання C ++. Якщо ви працюєте з безліччю старих кодів, вам потрібно зрозуміти, як це працює, а тому, ймовірно, потрібні широкі знання C ++. Якщо ви просто пишете новий код (наприклад, у змаганнях), ви можете обмежитися лише тим, що збираєтесь використовувати, уникаючи великої кількості сурових (наприклад, скажімо auto_ptr<>).
Девід Торнлі

Чудова відповідь, але я думаю, що "Багато програм C також є дійсними програмами C ++" не є досить сильною, оскільки відмінності не змінюють генерацію коду. Майже кожну програму C можна було б переписати як ідентично дійсну програму C ++ з відносно невеликими зусиллями.
Gort the Robot

3

Такі конкурси стосуються не стільки швидкості програми, скільки швидкості програміста. C ++ має стандартні функції бібліотеки, безпеку типу та допомогу в управлінні пам'яттю, що робить розробку та налагодження швидшими, навіть якщо виконуваний файл закінчується трохи повільніше.


2

Якщо говорити як попередній фіналіст Code Jam, то здебільшого мова йде про бібліотеки, а не про мовні особливості. Конкурентні рішення рідко використовують будь-які принципи проектування OOP, але ви, швидше за все, побачите більшість стандартних бібліотечних контейнерів та алгоритмів - рядок, вектор, список, стек, черга, deque, prior_queue, набір, карта, комплекс, пара, розрядний, нижній_бійд, зворотний, сортування, пошук, підрахунок, nth_element, min, max, min_element, max_element, унікальний, next_permutation, ... кваліфіковані учасники будуть ознайомлені з усіма ними та отримають багато часу, не потребуючи впровадження та налагодити їх у C.

Code Jam дозволяє учасникам вводити власний код і використовувати сторонні бібліотеки, тому теоретично у учасника це все може бути попередньо реалізовано в C. Однак, не всі конкурси дозволяють цього, а шаблони та перевантаження операторів роблять це набагато читабельніше ніж у С.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.