Programlama yarışmalarında ve yarışmalarda C ++ neden baskın? [kapalı]


23

C ++ 'ın çok hızlı bir dil olduğunu anlıyorum, ancak bazı durumlarda C kadar hızlı ya da daha hızlı değil mi?

O zaman, C ++ 'ın OOP olduğunu söyleyebilirsiniz, ancak çoğu programlama bulmaca için ihtiyacınız olan OOP miktarı o kadar büyük değildir ve bence C bunu yapabilir.

İşte bu yüzden şunu soruyorum : Yarışma ve yarışmaların programlanmasıyla çok ilgileniyorum ve bunlara C de kodlamaya alışkınım. Ancak, insanların büyük çoğunluğunun C ++ kullandığını fark ettim (örneğin, Google Code Jam 2011'deki 25 finalistten 17'si, kimse C kullanmadı), bu yüzden C ile bir dezavantajda olup olmadığımı merak ediyorum.

Nesne Oryantasyonu dışında, C ++ 'ı yarışmaların programlanması için daha uygun bir dil yapan şey nedir? Yarışmalarda daha iyi performans göstermek için öğrenmem ve kullanmam gereken dilin özellikleri nelerdir?

Arkaplan için kendimi C konusunda oldukça uzman biri olarak görüyorum, ancak daha yeni C ++ öğrenmeye başlıyorum.

Yanıtlar:


56

Başlamak için, her zaman bir dilde diğerinden daha iyi çözülen bazı sorunlar olacaktır. Bazı "iyi" tanımları için, belirli sorunları "diğer" dillerden "daha iyi" çözen diller her zaman olacaktır. Bununla birlikte, çok çok sayıda sorunun çok benzer ihtiyaçları vardır (bazı giriş / çıkışlar, bazı hesaplamalar) ve benzer gereksinimlerle (makul güvenilirlik, makul performans) karşı karşıya kalırlar.

Zaten C'yi bildiğiniz gibi, oradaki sorunların büyük çoğunluğu için, C ++ 'ın önemli bir dezavantajı ve bir dizi önemli iyileştirme sağlamadığını belirtiyorum. Kalın? Bazı insanlar öyle düşünüyor, ama gerçekten durum bu. Birkaç yaygın C ++ yanlış anlaşılmalarını temizleyerek başlayalım:

  • C ++ C'den daha yavaştır. Yanlış! Birçok C programı da geçerli C ++ programlarıdır - ve böyle bir C programının C derleyicisi veya C ++ derleyicisi ile derlendiğinde aynı hızda çalışması gerekir.

  • C ++ 'a özgü özellikler ek yük gerektirir. Yanlış! Bazı C ++ 'a özgü özelliklerin (sanal işlev çağrıları veya istisnalar gibi) getirdiği ek yükü, C de benzer bir özellik uygularsanız, kendiniz ekleyeceğiniz ek yük ile karşılaştırılabilir.

  • C ++ nesne yönelimlidir. Yanlış! C ++ dili, nesneye yönelik programlama ve genel programlamayı kolaylaştıran bazı dil uzantıları içerir. C ++, nesne yönelimli tasarımı herhangi bir yere zorlamaz - yalnızca izin verir. C, nesne yönelimli programlamaya da izin verir, C ++ onu daha basit ve daha az hataya açık hale getirir.

Bu yüzden, eğer bana inanıyorsanız, "C ++ 'ın C'den önemli ölçüde daha kötü olmadığını" tespit ettik. C ++ 'ı daha iyi C yapan şeylere bir göz atalım:

  • Daha güçlü yazma C ++ 'daki tip sistemi, C' den daha kuvvetlidir. Bu, birçok yaygın programlama hatasını önler - bir sonraki çok önemli özellik ile birlikte, daha güçlü olan tip sistemi bile rahatsızlık vermemeyi başarır.

  • Parametreli türler template anahtar kelimesi programcının algoritmaların jenerik (tip-agnostik) uygulamaları yazmasına izin verir. C'nin nerede olduğu gibi bir element ile genel bir liste uygulaması yazılabilir:

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

C ++ birinin şöyle bir şey yazmasına izin verir:

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

C ++ uygulaması sadece genel programcı hatalarını engellemekle kalmaz (listede yanlış tipte bir eleman koymak gibi), aynı zamanda derleyici tarafından daha iyi optimizasyon sağlar! Örneğin, genel bir sıralama uygulaması hem C hem de C ++ ile kullanılabilir -

C rutini şöyle tanımlanır:

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

C ++ rutini;

template void sort(RandomAccessIterator first, RandomAccessIterator last);

Fark, örneğin bir tamsayı dizisini sıralamanın, C durumunda, her bir karşılaştırma için bir işlev çağrısı gerektirmesidir; oysa C ++ uygulaması, derleyicinin, tam sıralama karşılaştırma çağrıları satır içi sıralamasını sağlar; derleyici tarafından derleme sırasında otomatik olarak başlatılır, şablon argümanlarına doğru türler eklenir.

  • Daha büyük bir standart kütüphane C ++, C standart kütüphanenin tam olarak kullanılmasını sağlar. Elbette, C standart kütüphanesi gerçek dünya programları yazarken paha biçilmez bir kaynak olduğu için çok önemlidir. Bununla birlikte, C ++, Standart Şablon Kütüphanesini içerir. STL, yukarıdaki sıralama rutini gibi bir dizi kullanışlı şablon içerir. Listeler, haritalar, kümeler, vb. Gibi faydalı ortak veri yapılarını içerir. Sıralama rutini gibi, diğer STL rutinleri ve veri yapıları, programcının sahip olduğu özel ihtiyaçlara göre "uyarlanır" - tüm programcının yapması gereken, türleri.

Elbette, STL gümüş mermi değildir - ancak genel problemleri çözerken çok sık yardımcı olur. C listesini ne sıklıkla uyguladınız? Bir RB-ağacı ne kadar sıklıkla daha iyi bir çözüm olurdu, ancak bunu yapacak vaktiniz olsaydı? STL ile bu gibi tavizler vermenize gerek yok - ağacı daha uygunsa kullanın, listeyi kullanmak kadar kolay.

Tamam, sadece iyi kısımları tartışıyordum. Herhangi bir olumsuz tarafı var mı? Tabii ki var. Ancak sayıları günden güne azalıyor. Açıklamama izin ver:

  • İyi bir C ++ derleyicisi yok Uzun zamandır böyle. Ancak, dilin 1998'de standartlaştırıldığını - C'den daha karmaşık, karmaşık bir dil olduğunu, derleyicilerin standarda uymasının uzun zaman aldığını hatırlamalısınız. Ancak bu yazı itibariyle, orada en çok kullanılan platformlar için mevcut iyi derleyiciler var; 3.X versiyonlarındaki GCC genellikle çok iyidir ve GNU / Linux ve çoğu UNIX platformunda çalışır. Intel, Win32 için iyi bir derleyiciye sahip - aynı zamanda oldukça iyi, ama ne yazık ki hala alt-par olan MS STL'ye güveniyor.

  • İnsanlar iyi bilmez C ++ Bu sıkça duyulan bir şikayet değil, ama çokça gördüğüm bir şey. C ++ büyük ve karmaşık bir dildir - ama aynı zamanda "OOP açlığı çözer, AIDS ve kanseri tedavi eder" günlerinde çok fazla sinirlendirilen bir dildi. Sonuç, burada ve orada birkaç sınıf bildirimi olan temelde kötü C olan birçok gerçekten kötü C ++ kodunun var olduğu ve öğrenme materyali olarak kullanılmakta olduğu görülüyor. Bu, C ++ 'ı tanıdığına inanan pek çok insan gerçekten çok berbat bir kod yazdığı anlamına gelir. Bu çok kötü ve bu bir problem, ama bunu C ++ 'da suçlamanın haksızlık olduğunu düşünüyorum.

Yani, C ++ ile ilgili iki büyük sorun, C ++ 'nın genç bir dil olmasının sonucudur. Zamanla yok olurlar. Ve buradaki çoğu sorun için, eğer iyi programcılar elde edebilirseniz (ya da iyi C ++ 'ı öğreniyorsanız), bugün sorun değil.


8
+1. Çok eksiksiz cevap. Farklı bir düşünceye sahip olduğum tek şey, gelecekte C ++ 'nın ana dezavantajlarının ortadan kalkacağı yönünde. C ++ 'ın geriye doğru uyumlu olması gerektiğinden, C ++' dan neredeyse hiçbir dil özelliği kaldırılmayacak, yalnızca yenileri eklendi (C ++ 11 bunun için mükemmel bir örnek). Bu, dili bugün olduğundan daha karmaşık hale getirecek, IMHO C ++ 'ın en büyük dezavantajı.
Doktor Brown,

@DocBrown: Bu, C ++ 'ı nasıl kullandığınıza bağlıdır. Çok sayıda eski kodla çalışıyorsanız, bunun nasıl çalıştığını anlamanız gerekir ve bu nedenle muhtemelen geniş bir C ++ bilgisine ihtiyacınız vardır. Eğer sadece yeni bir kod yazıyorsanız (bir yarışmada olduğu gibi), kendinizi kullanacağınız şeyle sınırlandırabilir, çok fazla sıkıntıdan kaçının (örneğin, diyelim auto_ptr<>).
David Thornley

Harika bir cevap, ancak "birçok C programı da geçerli C ++ programlarıdır", farklılıklar kod oluşturmayı değiştiremediğinden yeterince güçlü değildir. Neredeyse her C programı, nispeten az çabayla aynı performans gösteren geçerli bir C ++ programı olarak yeniden yazılabilir.
Robot'a

3

Öyle yarışmalar, programın hızıyla programcının hızı kadar fazla değildir. C ++ standart kütüphane özelliklerine sahiptir, güvenliği yazabilir ve çalıştırılabilir biraz daha yavaş bitse bile daha hızlı bir şekilde gelişmeyi ve hata ayıklamayı sağlayan bellek yönetimine yardımcı olur.


2

Önceki bir Code Jam finalisti olarak konuşurken, çoğunlukla dil özellikleri yerine kütüphaneler hakkındadır. Rekabet çözümleri nadiren herhangi bir OOP tasarım ilkesini kullanır, ancak standart kütüphane kaplarının ve algoritmalarının çoğunun bir turunu göreceksiniz - dizi, vektör, liste, yığın, sıra, deque, priority, sıra, set, harita, karmaşık, çift, bitset, lower_bound, reverse, sort, find, count, nth_element, min, max, min_element, max_element, unique, next_permutation, ... yetenekli yarışmacılar hepsine aşina olacak ve uygulamak zorunda kalmayacakları çok fazla zaman kazanacak ve Onları C’de ayıkla.

Code Jam yarışmacıların kendi kodlarını getirmelerine ve üçüncü taraf kütüphanelerini kullanmalarına izin verir, böylece teoride bir yarışmacı tüm bunları C de önceden uygulamış olabilir. C.’de olduğundan

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.