프로그래밍 콘테스트 및 경쟁에서 C ++가 우세한 이유는 무엇입니까? [닫은]


23

C ++은 매우 빠른 언어이지만 C가 빠르거나 빠르지는 않다는 것을 알고 있습니다.

그렇다면 C ++에 OOP가 있다고 말할 수도 있지만 대부분의 프로그래밍 퍼즐에 필요한 OOP의 양은 크지 않으며 C는 처리 할 수 ​​있습니다.

여기에 내가 묻는 이유는 다음과 같습니다 . 나는 프로그램 콘테스트와 경쟁에 매우 관심이 있으며, C로 코딩하는 데 익숙합니다. 그러나 대다수의 사람들이 C ++ (예 : Google Code Jam 2011 최종 후보 25 명 중 17 명은 C를 사용하지 않았지만 17 명은 C를 사용하지 않음)을 사용하는 것으로 나타났습니다.

객체 지향과는 별도로 C ++을 프로그래밍 경쟁에 더 적합한 언어로 만드는 이유는 무엇입니까? 대회에서 더 잘 수행하기 위해 배우고 사용해야하는 언어의 특징은 무엇입니까?

배경은 C에 능숙하다고 생각하지만 C ++을 배우기 시작했습니다.

답변:


56

우선, 한 언어에서 다른 언어보다 더 잘 해결되는 문제가 항상 있습니다. "더 나은"에 대한 정의를 위해 다른 언어보다 "더 나은"특정 문제를 해결하는 언어가 항상 있습니다. 그러나 매우 많은 수의 문제는 매우 유사한 요구 (일부 I / O, 일부 계산)를 가지며 유사한 요구 사항 (합리적인 신뢰성, 합리적인 성능)에 직면합니다.

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 표준 라이브러리를 완전히 사용할 수 있습니다. 물론 C 표준 라이브러리는 실제 프로그램을 작성할 때 매우 유용한 리소스이므로 매우 중요합니다. 그러나 C ++에는 표준 템플릿 라이브러리가 포함되어 있습니다. STL에는 위의 정렬 루틴과 같은 유용한 템플릿이 많이 있습니다. 여기에는 목록, 맵, 세트 등과 같은 유용한 공통 데이터 구조가 포함됩니다. 정렬 루틴과 마찬가지로 다른 STL 루틴 및 데이터 구조는 프로그래머가 요구하는 특정 요구에 맞게 "맞춤화"됩니다. 유형.

물론 STL은 은색 총알이 아니지만 일반적인 문제를 해결할 때 큰 도움이됩니다. C로 얼마나 자주 목록을 구현 했습니까? RB-tree가 시간이 있었다면 얼마나 자주 더 나은 솔루션이 되었습니까? STL을 사용하면 그러한 타협을 할 필요가 없습니다. 더 적합하다면 트리를 사용하십시오. 목록을 사용하는 것만 큼 쉽습니다.

좋습니다, 그래서 나는 좋은 부분에 대해서만 논의했습니다. 단점이 있습니까? 물론 있습니다. 그러나 그 숫자는 날마다 줄어들고 있습니다. 설명하겠습니다 :

  • 좋은 C ++ 컴파일러는 없습니다 . 이런 식으로 오랫동안 사용되었습니다. 그러나 언어는 1998 년에 표준화되었다는 것을 기억해야합니다. 언어는 C보다 복잡한 복잡한 언어입니다. 컴파일러가 표준을 따라 잡는 데 오랜 시간이 걸렸습니다. 그러나이 글을 쓰는 시점에서 가장 널리 사용되는 플랫폼에 사용할 수있는 좋은 컴파일러가 있습니다. 버전 3.X의 GCC는 일반적으로 매우 우수하며 GNU / Linux 및 대부분의 UNIX 플랫폼에서 실행됩니다. 인텔은 Win32 용으로 좋은 컴파일러를 가지고 있습니다. 또한 매우 좋지만 불행히도 여전히 하위 수준 인 MS STL에 의존합니다.

  • 사람들은 좋은 C ++을 모른다. 이것은 종종 들리는 불만은 아니지만, 내가 많이 본 것입니다. C ++는 크고 복잡한 언어입니다. 그러나 특히 "OOP는 기아를 해결하고, AIDS와 암을 치료합니다"시대에 많이 찬성했던 언어였습니다. 결과적으로 여기저기서 몇 가지 클래스 선언이있는 나쁜 C C 코드, 기본적으로 나쁜 C가 많이 있으며 학습 자료로 사용되는 것으로 보입니다. 이것은 C ++을 알고 있다고 믿는 많은 사람들이 실제로 엉터리 코드를 작성한다는 것을 의미합니다. 너무 나쁘고 문제이지만 C ++에서 이것을 비난하는 것은 불공평하다고 생각합니다.

따라서 C ++의 두 가지 주요 문제점은 C ++이 젊은 언어라는 결과입니다. 시간이 지나면 그들은 사라질 것입니다. 그리고 대부분의 문제에 대해 좋은 프로그래머를 얻거나 스스로 좋은 C ++을 배울 수 있다면 오늘날 문제는 실제로 문제가되지 않습니다.


8
+1. 매우 완전한 답변. 내가 다른 의견을 가진 유일한 것은 앞으로 C ++의 주요 단점이 사라질 것이라는 것입니다. C ++은 이전 버전과 호환 가능해야하므로 C ++에서 언어 기능이 거의 제거되지 않고 새로운 기능 만 추가됩니다 (C ++ 11이 이에 대한 완벽한 예입니다). 이것은 언어를 오늘날보다 훨씬 더 복잡하게 만들 것입니다. IMHO는 C ++의 가장 큰 단점입니다.
Doc Brown

@DocBrown : C ++ 사용 방법에 따라 다릅니다. 많은 오래된 코드로 작업하는 경우 어떻게 작동하는지 이해해야하므로 C ++에 대한 광범위한 지식이 필요할 것입니다. 경쟁사에서와 같이 새 코드를 작성하는 경우 많은 부스러기 (예 :)를 피하면서 사용할 코드로 제한 할 수 있습니다 auto_ptr<>.
David Thornley

좋은 대답이지만 "많은 C 프로그램도 유효한 C ++ 프로그램입니다"라는 차이점이 코드 생성을 변경하지 않기 때문에 충분히 강하지는 않다고 생각합니다. 거의 모든 C 프로그램을 비교적 적은 노력으로 동일한 성능의 유효한 C ++ 프로그램으로 다시 작성할 수 있습니다.
로봇 고 르트

3

이와 같은 콘테스트는 프로그래머의 속도만큼 프로그램의 속도에 관한 것이 아닙니다. C ++에는 표준 라이브러리 기능, 형식 안전성이 있으며 실행 파일이 약간 느려지더라도 개발 및 디버깅 속도를 높이는 메모리 관리에 도움이됩니다.


2

이전 코드 잼 결선 진출 자로 말하면 언어 기능이 아닌 라이브러리에 관한 것입니다. 경쟁 솔루션은 OOP 디자인 원칙을 거의 사용하지 않지만 문자열, 벡터, 목록, 스택, 대기열, deque, priority_queue, set, map, complex, pair, bitset, lower_bound, reverse, sort, find, count, nth_element, min, max, min_element, max_element, unique, next_permutation, ... 숙련 된 참가자는 그들 모두에게 친숙하고 구현하지 않아도 많은 시간을 얻습니다. C로 디버깅하십시오.

코드 잼을 사용하면 참가자는 자신의 코드를 가져 와서 타사 라이브러리를 사용할 수 있으므로 이론적으로 참가자는이를 C에서 미리 구현할 수 있습니다. C보다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.