首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么C++在编程竞赛和竞赛中占主导地位?

为什么C++在编程竞赛和竞赛中占主导地位?
EN

Software Engineering用户
提问于 2011-12-16 11:39:15
回答 3查看 9.5K关注 0票数 24

我知道C++是一种非常快的语言,但在某些情况下C不是同样快还是更快?

然后,您可能会说C++有OOP,但是大多数编程难题所需的OOP数量并不大,在我看来,C可以处理这个问题。

以下是我问这个问题的原因:我对编程竞赛和竞赛非常感兴趣,我习惯于用C语言编写这些代码。然而,我注意到绝大多数人使用C++ (例如,2011年Google上的25名入围者中有17名使用了它,而没有人使用C),所以我想知道我是否在使用C时处于劣势。

除了面向对象之外,是什么使C++成为更适合编程竞赛的语言呢?在比赛中,我应该学习和使用的语言有哪些特点?

作为背景,我认为自己对C相当精通,但我才刚刚开始学习C++。

EN

回答 3

Software Engineering用户

回答已采纳

发布于 2011-12-16 11:54:04

首先,总会有一些问题用一种语言比另一种语言更好地解决。对于“更好”的定义,总会有比任何其他语言“更好”解决具体问题的语言。然而,很多问题有着非常相似的需求(一些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中,可以使用如下元素编写泛型列表实现: struct element_t { struct element_t *next,*prev;void *element_t;};

C++允许一个人编写这样的东西:

代码语言:javascript
复制
template <typename T>
struct element_t {
   element_t<T> *next, *prev;
   T element;
};

C++实现不仅可以防止常见的程序员错误(比如在列表中放置错误类型的元素),还允许编译器进行更好的优化!例如,在C和C++中都有一个通用的排序实现-

C例程定义为:

代码语言:javascript
复制
void qsort(void *base, size_t nmemb, size_t size,
           int(*compar)(const void *, const void *));

而C++例程被定义为

代码语言:javascript
复制
template void sort(RandomAccessIterator first, RandomAccessIterator last);

区别在于,例如,排序一个整数数组,在C情况下,每一个比较都需要一个函数调用,而C++实现将允许编译器内联整数比较调用,因为编译器在编译时会自动实例化实际的排序例程,并在模板参数中插入正确的类型。

  • 一个更大的标准库C++允许充分使用C标准库。这当然非常重要,因为C标准库是编写真实世界程序的宝贵资源。但是,C++包括标准模板库。STL包含许多有用的模板,如上面的排序例程。它包括有用的通用数据结构,如列表、地图、集合等。与排序例程一样,其他STL例程和数据结构都是根据程序员的具体需要“量身定制”的--程序员所要做的就是填写类型。

当然,STL并不是灵丹妙药--但在解决一般问题时,它确实提供了很大的帮助。您用C实现列表的频率是多少次?如果你有时间去做的话,RB树会是一个更好的解决方案吗?使用STL,您不需要做出这样的妥协-使用树,如果它是一个更好的适合,它是一样容易使用列表。

好吧,所以我只是在讨论好的部分。有什么坏处吗?当然有。然而,他们的人数却一天比一天减少。让我解释一下:

  • 没有好的C++编译器--这种情况已经存在很长时间了。但是你必须记住,这门语言是在1998年标准化的--它是一种复杂的语言,比C语言更复杂。编译器需要很长时间才能赶上标准。但在本文撰写之时,有一些优秀的编译器可供最广泛使用的平台使用;3.X版本中的GCC通常非常好,它运行在GNU/Linux和大多数UNIX平台上。英特尔有一个很好的Win32编译器-它也相当好,但不幸的是,它仍然依赖于MS,这是不合格的。
  • 人们不知道好的C++这不是一个经常听到的抱怨,但这是我经常看到的东西。C++是一门庞大而复杂的语言,但它也曾是一种被大肆炒作的语言,尤其是在"OOP解决饥饿、治疗艾滋病和癌症“的时代。其结果似乎是,许多非常糟糕的C++代码(基本上是带有一些类声明的坏C代码)已经出现,并被用作学习材料。这意味着很多人认为他们知道C++实际上写的代码真的很糟糕。这太糟糕了,这是个问题,但我认为把这归咎于C++是不公平的。

因此,C++的两个主要问题是C++作为一种年轻语言的结果。它们迟早会消失的。对于大多数的问题来说,如果你能找到好的程序员(或者自己学习好的C++ ),那么这些问题现在就不是真正的问题了。

票数 55
EN

Software Engineering用户

发布于 2011-12-16 17:14:00

这样的竞赛与其说是关于程序的速度,不如说是关于程序员的速度。C++具有标准库特性、类型安全性和内存管理帮助,这使得开发和调试更快,即使可执行文件的速度稍慢。

票数 3
EN

Software Engineering用户

发布于 2013-10-19 19:04:12

说到之前的Code决赛,它主要是关于库,而不是语言特性。竞争解决方案很少使用任何OOP设计原则,但您可能会看到大多数标准库容器和算法-字符串、向量、列表、堆栈、队列、deque、priority_queue、set、map、复杂、对、位集、lower_bound、反向、排序、查找、计数、nth_element、min、max、min_element、max_element、unique、next_permutation、.熟练的参赛者将熟悉他们,并获得了大量的时间,不需要实现和调试他们在C。

代码Jam允许参赛者引入自己的代码并使用第三方库,因此理论上,参赛者可以在C中预先实现所有这些,然而,并不是所有的竞赛都允许这样做,模板和操作符重载使得这一点比C语言更加可读性。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/125576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档