Dlaczego C ++ dominuje w konkursach i konkursach programistycznych? [Zamknięte]


23

Rozumiem, że C ++ jest bardzo szybkim językiem, ale czy C nie jest tak szybki, czy w niektórych przypadkach szybszy?

Możesz więc powiedzieć, że C ++ ma OOP, ale ilość OOP, której potrzebujesz do większości zagadek programistycznych, nie jest aż tak duża i moim zdaniem C byłby w stanie sobie z tym poradzić.

Oto dlaczego pytam : jestem bardzo zainteresowany konkursami programistycznymi i jestem przyzwyczajony do kodowania w C na nich. Zauważyłem jednak, że zdecydowana większość osób używa C ++ (np. 17 z 25 finalistów Google Code Jam 2011 używało go, podczas gdy nikt nie używał C), więc zastanawiam się, czy nie jestem w niekorzystnej sytuacji, jeśli chodzi o C.

Co oprócz Object Orientation sprawia, że ​​C ++ jest bardziej odpowiednim językiem dla konkursów programistycznych? Jakich cech języka powinienem się nauczyć i używać, aby lepiej radzić sobie na zawodach?

W tle uważam się za dość biegłego w C, ale dopiero zaczynam się uczyć C ++.

Odpowiedzi:


56

Na początek zawsze będą problemy, które lepiej rozwiązać w jednym języku niż w innym. Zawsze będą języki, które rozwiążą określone problemy „lepiej” niż jakikolwiek inny język, dla pewnej definicji „lepszego”. Jednak bardzo duża liczba problemów ma bardzo podobne potrzeby (niektóre operacje we / wy, niektóre obliczenia) i napotyka podobne wymagania (rozsądna niezawodność, rozsądna wydajność).

Jak już znasz C, w przypadku większości istniejących problemów stwierdzam, że C ++ nie zapewnia znaczących wad i szeregu znaczących ulepszeń. Pogrubienie? Niektórzy ludzie tak myślą, ale tak naprawdę jest. Zacznijmy od wyjaśnienia kilku bardzo powszechnych nieporozumień w C ++:

  • C ++ jest wolniejszy niż C. Źle! Wiele programów w C jest również poprawnymi programami w C ++ - i taki program w C powinien działać z identyczną prędkością po skompilowaniu z kompilatorem C lub kompilatorem C ++.

  • Funkcje specyficzne dla C ++ wymagają narzutu. Źle! Tak zwany narzut wprowadzony przez niektóre funkcje specyficzne dla C ++ (takie jak wywołania funkcji wirtualnych lub wyjątki), jest porównywalny z narzutem, który sam byś wprowadził, gdybyś zaimplementował podobną funkcję w C.

  • C ++ jest zorientowany obiektowo. Źle! Język C ++ zawiera pewne rozszerzenia językowe, które ułatwiają programowanie obiektowe i programowanie ogólne. C ++ nigdzie nie wymusza projektowania obiektowego - po prostu na to pozwala. C pozwala również na programowanie obiektowe, C ++ tylko upraszcza i zmniejsza podatność na błędy.

Tak więc, jeśli mi wierzysz, ustaliliśmy, że „C ++ nie jest znacznie gorszy od C”. Zobaczmy, co czyni C ++ lepszym C:

  • Silniejsze pisanie System pisania w C ++ jest silniejszy niż w C. Zapobiega to wielu powszechnym błędom programistycznym - w połączeniu z kolejną bardzo ważną cechą, silniejszy system pisania nawet nie stanowi niedogodności.

  • Typy sparametryzowane Słowo kluczowe szablon umożliwia programiście pisanie ogólnych (agnostycznych) implementacji algorytmów. Gdzie w C można napisać ogólną implementację listy z elementem takim jak:

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

C ++ pozwala napisać coś takiego:

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

Implementacja C ++ nie tylko zapobiega częstym błędom programisty (np. Umieszczając element niewłaściwego typu na liście), ale także pozwala na lepszą optymalizację przez kompilator! Na przykład ogólna implementacja sortowania jest dostępna zarówno w C, jak i C ++ -

procedura C jest zdefiniowana jako:

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

podczas gdy procedura C ++ jest zdefiniowana jako

template void sort(RandomAccessIterator first, RandomAccessIterator last);

Różnica polega na tym, że na przykład sortowanie tablicy liczb całkowitych wymagałoby, w przypadku C, wywołania funkcji dla każdego porównania, podczas gdy implementacja C ++ pozwoliłaby kompilatorowi wstawić wywołania porównania liczb całkowitych, ponieważ faktyczna procedura sortowania jest automatycznie tworzony przez kompilator w momencie kompilacji, z poprawnymi typami wstawionymi w argumentach szablonu.

  • Większa standardowa biblioteka C ++ pozwala na pełne wykorzystanie standardowej biblioteki C. Jest to oczywiście bardzo ważne, ponieważ biblioteka standardowa C jest nieocenionym zasobem podczas pisania programów w świecie rzeczywistym. Jednak C ++ zawiera Standardową bibliotekę szablonów. STL zawiera wiele przydatnych szablonów, takich jak powyższa procedura sortowania. Zawiera przydatne wspólne struktury danych, takie jak listy, mapy, zestawy itp. Podobnie jak procedura sortowania, pozostałe procedury STL i struktury danych są „dostosowane” do konkretnych potrzeb programisty - programista musi jedynie wypełnić typy.

Oczywiście STL nie jest srebrną kulą - ale bardzo często pomaga w rozwiązywaniu ogólnych problemów. Jak często implementowałeś listę w C? Jak często drzewo RB byłoby lepszym rozwiązaniem, gdybyś miał na to czas? Dzięki STL nie musisz robić takich kompromisów - użyj drzewa, jeśli jest lepiej dopasowane, to tak proste, jak korzystanie z listy.

Ok, więc rozmawiałem tylko o dobrych częściach. Czy są jakieś wady? Oczywiście że są. Jednak ich liczba maleje z dnia na dzień. Pozwól mi wyjaśnić:

  • Nie ma dobrych kompilatorów C ++ Od dawna tak jest. Musisz jednak pamiętać, że język został ustandaryzowany w 1998 r. - jest to język złożony, bardziej złożony niż C. Kompilatory zajęły dużo czasu, aby dogonić ten standard. Jednak w chwili pisania tego tekstu dostępne są dobre kompilatory dla najczęściej używanych platform; GCC w wersjach 3.X są ogólnie bardzo dobre i działa na systemach GNU / Linux i większości platform UNIX. Intel ma dobry kompilator dla Win32 - jest również całkiem dobry, ale niestety nadal opiera się na MS STL, który jest poniżej par.

  • Ludzie nie znają dobrego C ++ To nie jest często słyszana skarga, ale bardzo ją widzę. C ++ jest dużym i złożonym językiem - ale był także językiem, który był często prześladowany, szczególnie w czasach „OOP rozwiązuje głód, leczy AIDS i raka”. Rezultat wydaje się taki, że wiele naprawdę słabego kodu C ++, w zasadzie zły C z kilkoma deklaracjami klas tu i tam, jest tam i jest wykorzystywany jako materiał do nauki. Oznacza to, że wiele osób, które wierzą, że wiedzą, że C ++ pisze naprawdę kiepski kod. To źle, i to jest problem, ale myślę, że to niesprawiedliwe obwinianie tego o C ++.

Zatem jedynymi dwoma głównymi problemami z C ++ są to, że C ++ jest młodym językiem. Z czasem znikną. W przypadku większości problemów, jeśli możesz zdobyć dobrych programistów (lub samemu nauczyć się dobrego C ++), problemy nie są tak naprawdę dzisiaj problemem.


8
+1. Bardzo kompletna odpowiedź. Mam tylko inną opinię, że w przyszłości główne wady C ++ znikną. Ponieważ C ++ musi być kompatybilny z poprzednimi wersjami, prawie nie będzie żadnych funkcji językowych z C ++, dodano tylko nowe (C ++ 11 jest tego doskonałym przykładem). To sprawi, że język będzie jeszcze bardziej skomplikowany niż obecnie, co jest IMHO największym minusem C ++.
Dok. Brown

@DocBrown: To zależy od tego, jak używasz C ++. Jeśli pracujesz z dużą ilością starszego kodu, musisz zrozumieć, jak to działa, a zatem prawdopodobnie potrzebujesz szerokiej wiedzy o C ++. Jeśli piszesz nowy kod (na przykład w konkursie), możesz ograniczyć się do tego, czego będziesz używać, unikając wielu cruft (np auto_ptr<>.).
David Thornley,

Świetna odpowiedź, ale myślę, że „Wiele programów w C jest również poprawnymi programami w C ++” nie jest wystarczająco silna, ponieważ różnice nie zmieniają generowania kodu. Niemal każdy program C można przepisać jako poprawnie działający program C ++ przy stosunkowo niewielkim wysiłku.
Gort the Robot

3

W takich konkursach chodzi nie tyle o szybkość programu, co o szybkość programisty. C ++ ma standardowe funkcje biblioteki, bezpieczeństwo typów i pomoc w zarządzaniu pamięcią, co przyspiesza tworzenie i debugowanie, nawet jeśli plik wykonywalny kończy się nieco wolniej.


2

Mówiąc jak poprzedni finalista Code Jam, chodzi głównie o biblioteki, a nie o funkcje językowe. Rozwiązania konkurencji rzadko wykorzystują jakiekolwiek zasady projektowania OOP, ale prawdopodobnie zobaczysz przewodnik po większości standardowych kontenerów i algorytmów bibliotecznych - ciąg, wektor, lista, stos, kolejka, deque, kolejka_ priorytetowa, zestaw, mapa, kompleks, para, bitset, lower_bound, reverse, sort, find, count, nth_element, min, max, min_element, max_element, unikalny, next_permutation, ... wykwalifikowani zawodnicy znają je wszystkie i zyskają dużo czasu, nie musząc wdrażać i debuguj je w C.

Code Jam pozwala uczestnikom na wprowadzenie własnego kodu i korzystanie z bibliotek stron trzecich, więc teoretycznie uczestnik może mieć to wszystko wstępnie zaimplementowane w C. Jednak nie wszystkie konkursy na to pozwalają, a przeciążenie szablonów i operatora czyni to o wiele bardziej czytelnym niż w C.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.