Questions tagged «c++»

有关C ++的问题,C ++是一种静态类型,自由格式,多范式,已编译的通用编程语言。

17
最好的C ++面试问题是什么?[关闭]
如果您可以问一个C ++程序员一个问题来衡量他们的C ++技能,那会是什么? 我认为最好的问题是:您可以称之为“删除此”吗?成员函数内部?(我将其作为链接,因此您可以首先考虑一下,然后转到“最佳C ++面试问题–永远!”以查看正确的答案。) 我不问这个问题是因为我希望大多数人都知道答案。如果他们这样做了,那么这将不是一个有用的问题。我要求看看他们是否可以按照自己的方式来获得正确答案,以及如何做到这一点。
28 c++  interview 

2
纯抽象类和接口的实现
尽管在C ++标准中这不是强制性的,但例如,GCC似乎通过在每个相关类的实例中都包含指向该抽象类的v表的指针来实现父类(包括纯抽象类)的方式。 自然,这通过其具有的每个父类的指针使该类的每个实例的大小膨胀。 但是我注意到许多C#类和结构都有很多父接口,它们基本上是纯抽象类。如果对say的每个实例Decimal都充满了指向所有各种接口的6个指针,我会感到惊讶。 因此,如果C#确实使用不同的接口,至少在典型的实现中,它如何实现它们(我知道标准本身可能没有定义这种实现)?在将纯虚拟父代添加到类时,是否有任何C ++实现都可以避免对象大小膨胀?


3
哪种字符串搜索算法实际上是最快的?
我一直被困在最快的字符串搜索算法上一段时间,听到了很多意见,但是最后我不确定。 我听到有人说最快的算法是Boyer-Moore,有人说Knuth-Morris-Pratt实际上更快。 我一直在寻找它们两者的复杂性,但是它们看起来大致相同O(n+m)。我发现在最坏的情况下,博耶·摩尔O(nm)要比具有O(m + 2 * n)的克努斯·莫里斯·普拉特复杂。其中,n =文本长度,m =模式长度。 据我所知,如果我使用加利尔定律,博耶-摩尔的情况将是最糟的。 我的问题,总的来说,这实际上是最快的字符串搜索算法(此问题包括所有可能的字符串算法,而不仅仅是Boyer-Moore和Knuth-Morris-Pratt)。 编辑:由于这个答案 我要寻找的是: 鉴于文本T和图形P我必须找到所有的出场P在T。 P和T的长度也来自[1,2 000 000],程序必须在0.15秒内运行。 我知道KMP和Rabin-Karp足以在该问题上获得100%的分数,但是我想尝试实施Boyer-Moore。哪种模式搜索最合适?

7
如何学习编写惯用的C ++?
我是一名计算机科学专业的学生,​​因此,我被教导C ++是带有类的C的更好版本。我最终试图在需要解决复杂问题的时候重新发明轮子,直到后来才发现,某种语言功能或某些标准库例程可能为我完成了这项工作。 我所有的舒适与我char*和*(int*)(someVoidPointer)成语,但最近,制作到一个开源项目(未成年人)的贡献之后,我觉得这不是一个人应该如何编写C ++代码时认为。它与C有很大的不同。 考虑到我对面向对象的编程非常了解,并且我的学习曲线也不错,当我编写C ++时,您对我有什么建议可以使我进入C ++轨道?
27 c++ 

8
弃用是否有害?[关闭]
我一直-std=c++0x在用GCC中的标志编译自己的代码,因为我想隐约地跟上所有年轻人的行为(前提是他们留在草坪上),最后我得到了很多警告关于auto_ptr被弃用 当然,我知道auto_ptr在C ++ 0x 中已弃用,但是... 弃用不是浪费时间和精力吗?不弃用的原因(以auto_ptr为例): 仍然有大量代码需要得到支持,产生数百万条警告只会诱使人们关闭警告。 auto_ptr 是个小问题,但实际上确实可以做到。 如果我们真的想弃用东西,我提名printf()。但是,请想象将会发生的尖叫声。auto_ptr没有太多的朋友,但是至少在我的C ++代码中,它的使用量大于printf,根本没有使用。 该委员会对此有不好的记录-他们在名称空间范围内弃用了static,现在似乎已经弃用了-如果auto_ptr做出类似的复出,我不会感到惊讶 最后,无论委员会怎么说,编译器实施者都不会理ignore它们-他们根本不能冒险破坏客户代码,他们所能做的就是发出令人讨厌的警告。 所以我的问题是-您是否认为弃用(任何东西,不仅是auto_ptrs,而且不只是C ++)是个好主意,如果可以,为什么?

5
C ++模板只是一种美化的宏吗?
通过C ++模板和C#/ Java泛型之间的不同比较,例如: /programming/31693/what-are-the-differences-between-generics-in-c-and-java-and-templates-in-c/31929#31929 我感觉到,C ++模板是通过某种预处理(在解析之前替换纯文本)而不是通过编译实现的。因为C ++模板中的类型检查类似于C宏。我的意思是,如果存在一些错误,它们是处理模板代码块后生成的代码中的错误,而不是模板本身中的错误。换句话说,它们只是C语言中宏的一种上层版本。 然后我发现了其他一些事实支持这一点- 我认为,如果C ++模板通过预处理实现,则动态链接(使用.dll)会出现问题。快速搜索支持了这一点。 另一点是,整数常量可以作为参数传递给模板。而且它甚至支持某种递归。但是在编译的汇编/机器代码中找不到此递归。通过为每个递归调用生成函数,可以在编译时管理递归对象,因此具有更大但更快的可执行二进制文件。 尽管与C宏不同,但它具有一些优越的功能。但是C ++模板不是通过某种预处理实现的吗?如何在不同的C ++编译器中实现?
27 c++  c  compiler  templates  macros 

2
标记C ++函数constexpr是否曾经很糟糕?
鉴于功能非常微不足道, int transform(int val) { return (val + 7) / 8; } 很明显,将这个函数变成一个constexpr函数很容易,允许我在定义constexpr变量时使用它,如下所示: constexpr int transform(int val) { return (val + 7) / 8; } 我的假设是,这严格来说是一种改进,因为该函数仍可以在非constexpr上下文中调用,并且现在也可以用于帮助定义编译时常量变量。 我的问题是,在某些情况下这是个坏主意吗?就像通过执行此功能一样,constexpr我是否可以遇到在特定情况下该功能将不再可用或行为异常的情况?
26 c++  c++11 

11
被多线程错误困扰
在我管理的新团队中,我们的大部分代码是平台,TCP套接字和http网络代码。所有C ++。其中大多数来自离开团队的其他开发人员。团队中目前的开发人员非常聪明,但从经验来看大多是初级的。 我们最大的问题:多线程并发错误。我们的大多数类库都通过使用某些线程池类而被编写为异步的。类库中的方法通常将长时间运行的任务从一个线程排队到线程池中,然后在另一个线程上调用该类的回调方法。结果,我们有很多涉及错误线程假设的边缘错误。这导致了一些细微的错误,这些错误不仅仅具有关键部分和锁以防止并发问题。 使这些问题更难解决的是,修复尝试通常是不正确的。我发现团队在尝试(或在遗留代码本身中)尝试犯的一些错误包括以下内容: 常见错误#1-通过仅对共享数据进行锁定来解决并发问题,但是忘记了当方法未按预期顺序调用时会发生什么情况。这是一个非常简单的示例: void Foo::OnHttpRequestComplete(statuscode status) { m_pBar->DoSomethingImportant(status); } void Foo::Shutdown() { m_pBar->Cleanup(); delete m_pBar; m_pBar=nullptr; } 因此,现在有了一个错误,其中在OnHttpNetworkRequestComplete发生时可以调用Shutdown。测试人员找到错误,捕获故障转储,并将错误分配给开发人员。他反过来修复了这样的错误。 void Foo::OnHttpRequestComplete(statuscode status) { AutoLock lock(m_cs); m_pBar->DoSomethingImportant(status); } void Foo::Shutdown() { AutoLock lock(m_cs); m_pBar->Cleanup(); delete m_pBar; m_pBar=nullptr; } 除非您意识到还有一个更微妙的边缘情况,否则上面的修补程序看起来不错。如果在调用OnHttpRequestComplete 之前调用Shutdown,会发生什么情况?我的团队拥有的真实示例更加复杂,并且在代码审查过程中很难发现边缘情况。 常见错误#2-通过盲目退出锁来解决死锁问题,等待另一个线程完成,然后重新进入锁-但是没有处理对象只是被另一个线程更新的情况! 常见错误#3-即使对象是引用计数,关闭序列也会“释放”它的指针。但是忘记等待仍在运行的线程释放它的实例。这样,组件将完全关闭,然后在不希望再有任何调用的状态下在对象上调用伪造或较晚的回调。 还有其他边缘情况,但最重要的是: 即使对于聪明人,多线程编程也很难。 当我发现这些错误时,我会花时间与每个开发人员讨论这些错误,以开发更合适的修复程序。但是我怀疑,由于“正确的”解决方案涉及到大量遗留代码,因此他们常常对如何解决每个问题感到困惑。 我们将很快发货,并且我确定我们正在应用的补丁将在即将发布的版本中保留。之后,我们将有一些时间来改善代码库并在需要时进行重构。我们将没有时间重新编写所有内容。而且大多数代码还不错。但是我希望重构代码,以便可以完全避免线程问题。 我正在考虑的一种方法是这种方法。对于每个重要的平台功能,请使用专用的单线程,将所有事件和网络回调整理到其中。与Windows中使用消息循环的COM公寓线程相似。长阻塞操作仍然可以分派到工作池线程,但是完成回调在组件的线程上调用。组件甚至可能共享同一线程。然后,可以在单个线程世界的假设下编写线程中运行的所有类库。 在走这条路之前,如果还有其他标准技术或设计模式来处理多线程问题,我也非常感兴趣。我必须强调-除了描述互斥量和信号量基础知识的书以外的内容。你怎么看? 我也对其他用于重构过程的方法感兴趣。包括以下任何一项: 有关线程周围设计模式的文献或论文。除了互斥量和信号量介绍之外,还有其他内容。我们也不需要大规模的并行性,只需设计对象模型以正确处理来自其他线程的异步事件的方法即可。 …

13
指导在C ++基础方面苦苦挣扎的学生[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 4年前关闭。 我正在辅导一些在学习其第一门编程语言的基础知识方面遇到重大困难的学生:C ++。我认识许多优秀而聪明的学生,他们的第一门CS课程都失败或辍学。我正在辅导的每个人都对他或她在课堂上的经历有类似的描述:讲师的步伐太快,讲课中没有任何意义,等等。在参加CS课程之前,这些挣扎中的大多数学生对计算机的兴趣不大,除了文字处理程序,Web浏览器或其他娱乐方式。电脑是可以正常工作的黑匣子,为什么要搞乱它呢? 我最好的猜测是,他们在将计算机科学的抽象与熟悉的概念联系起来时遇到了麻烦。也就是说,这些学生可能知道如何学习数学,生物学或物理学,但是在编程时这些技术不起作用。 有人有任何建议吗?我所帮助的学生不应因此而失败。显然,导师没有考虑这些学生的学习风格。就是说,导师没有让他的学生失败。

9
为什么要禁用编译器警告?
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 8年前。 这个答案和添加的注释显示了一种使用#pragma指令禁用多个编译器警告的方法。 为什么要这样做?通常,警告的存在是有原因的,我一直觉得它们是很好的理由。是否有应禁用警告的“有效情况”?现在我什么也想不出来,但也许就是我。
26 c#  c++  c  warnings 

25
C ++是否适合作为第一语言?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 一家当地大学正在向没有编程经验的一年级大学生(16岁)教授C ++。 作为第一门编程语言,C ++适合吗?

4
为什么C ++和Java都使用“引用”概念,但含义却不同?
在C ++中,对函数的引用参数允许函数使引用引用其他内容: int replacement = 23; void changeNumberReference(int& reference) { reference = replacement; } int main() { int i = 1; std::cout << "i=" << i << "\n"; // i = 1; changeNumberReference(i); std::cout << "i=" << i << "\n"; // i = 23; } 类似地,如果我们尝试更改引用,则对函数的常量引用自变量将引发编译时错误: void changeNumberReference(const int& reference) …
26 java  c++  pointers  reference 

4
如何在我的代码中避免“经理”
该问题是从Code Review Stack Exchange 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 6年前。 我目前正在为C ++ 重新设计我的实体系统,并且我有很多经理。在我的设计中,我有这些类,以便将我的库联系在一起。关于“经理”类,我听说过很多坏事,也许我没有适当地命名我的类。但是,我不知道还有什么名字。 在我的图书馆中,大多数经理都是由以下类组成的(尽管确实有所不同): 容器-管理器中对象的容器 属性-管理器中对象的属性 在我的图书馆新设计中,我有这些特定的类,以便将我的图书馆联系在一起。 ComponentManager-管理实体系统中的组件 组件容器 ComponentAttributes 场景*-对场景的引用(请参见下文) SystemManager-管理实体系统中的系统 系统容器 场景*-对场景的引用(请参见下文) EntityManager-管理实体系统中的实体 EntityPool-实体池 EntityAttributes-实体的属性(只能由ComponentContainer和System类访问) 场景*-对场景的引用(请参见下文) 场景-将所有经理联系在一起 组件管理器 系统管理员 实体管理器 我当时只是想将所有容器/池放入Scene类本身。 即 代替这个: Scene scene; // create a Scene // NOTE: // I technically could wrap this line …

3
使用struct和std :: pair之间有什么区别?
我是经验有限的C ++程序员。 假设我想使用STL map存储和操作某些数据,我想知道这两种数据结构方法之间是否存在任何有意义的差异(在性能上): Choice 1: map<int, pair<string, bool> > Choice 2: struct Ente { string name; bool flag; } map<int, Ente> 具体来说,使用a struct而不是simple会产生任何开销pair吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.