Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。

30
有没有简单的方法将C ++枚举转换为字符串?
假设我们有一些命名的枚举: enum MyEnum { FOO, BAR = 0x50 }; 我用谷歌搜索的是一种脚本(任何语言),该脚本扫描项目中的所有标头并生成每个枚举具有一个功能的标头。 char* enum_to_string(MyEnum t); 以及类似这样的实现: char* enum_to_string(MyEnum t){ switch(t){ case FOO: return "FOO"; case BAR: return "BAR"; default: return "INVALID ENUM"; } } 陷阱实际上是带有类型定义的枚举和未命名的C风格的枚举。有人知道吗? 编辑:解决方案不应修改我的源,除了生成的函数。枚举都在API中,因此使用到目前为止提出的解决方案只是一种选择。
123 c++  string  enums  scripting 

13
C ++性能挑战:整数到std :: string的转换
谁能击败下面链接到std :: string代码的整数的性能? 已经有几个问题可以解释如何std::string在C ++中将整数转换为一个整数,例如this,但是所提供的解决方案都不有效。 以下是可与之竞争的一些常见方法的编译就绪代码: 使用stringstream的“ C ++方式”:http : //ideone.com/jh3Sa sprintf,SO-ers通常向注重性能的人推荐:sprintf:http : //ideone.com/82kwR 与流行的看法相反,boost::lexical_cast它具有自己的实现(白皮书),并且不使用stringstream和数字插入运算符。我真的很想比较它的性能,因为另一个问题表明它很惨。 我自己的贡献在台式计算机上具有竞争力,并且展示了一种在嵌入式系统上也可以全速运行的方法,这与依赖于整数模的算法不同: Ben的算法:http://ideone.com/SsEUW 如果您想使用该代码,我将在简化的BSD许可下使它可用(允许用于商业用途,需要提供署名)。只是问问。 最后,该功能ltoa是非标准的,但可广泛使用。 ltoa版本,适用于拥有提供该版本的编译器的用户(ideone不提供):http ://ideone.com/T5Wim 我将很快发布我的绩效评估作为答案。 算法规则 提供用于将至少32位有符号和无符号整数转换为十进制的代码。 将输出生成为std::string。 没有与线程和信号不兼容的技巧(例如,静态缓冲区)。 您可以假设使用ASCII字符集。 确保在以下位置测试您的代码 INT_MIN在绝对值无法表示的二进制补码机上。 理想情况下,输出应与使用的标准C ++版本的字符换字符相同stringstream,http://ideone.com/jh3Sa,但任何事情,这显然是理解的,因为正确的号码也是OK。 新增:尽管您可以使用想要进行比较的任何编译器和优化器选项(完全禁用除外),但至少在VC ++ 2010和g ++下,代码也需要编译并给出正确的结果。 希望进行的讨论 除了更好的算法,我还想在几种不同的平台和编译器上获得一些基准(让我们使用MB / s吞吐量作为我们的标准度量单位)。我相信算法的代码(我知道sprintf基准测试有一些捷径-现在已经确定),至少在ASCII假设下,该代码是标准明确定义的行为,但是如果您看到任何未定义的行为或输入,则输出为无效,请指出。 结论: g ++和VC2010的算法不同,可能是由于每种算法的实现不同std::string。显然,VC2010在NRVO方面做得更好,仅在gcc上摆脱了按价值回报的方法。 发现代码的性能要好sprintf一个数量级。 ostringstream落后50倍甚至更多。 挑战的赢家是user434507,该用户生成的代码在gcc上运行我自己的速度的350%。由于SO社区的异想天开,其他条目已关闭。 当前(最终?)速度冠军是: 对于gcc:user434507,速度比快8倍sprintf: http 对于Visual C …

14
我应该在C ++中使用异常说明符吗?
在C ++中,可以通过使用异常说明符来指定一个函数可以抛出异常,也可以不抛出异常。例如: void foo() throw(); // guaranteed not to throw an exception void bar() throw(int); // may throw an exception of type int void baz() throw(...); // may throw an exception of some unspecified type 由于以下原因,我对实际使用它们表示怀疑: 编译器实际上并没有以任何严格的方式强制执行异常说明符,因此好处并不大。理想情况下,您希望获得一个编译错误。 如果函数违反异常说明符,我认为标准行为是终止程序。 在VS.Net中,它将throw(X)视为throw(...),因此对标准的遵循性不强。 您认为应该使用异常说明符吗? 请回答“是”或“否”,并提供一些理由来证明您的回答合理。


10
如何获得向量中的最大值(或最小值)?
如何在C ++中获取向量中的最大值(或最小值)? 我已经在Google上看到了一些解决方案,但是对我来说,这些解决方案都没有道理:( 有人可以用一种简单明了的方法解释如何从向量中获取最大值或最小值吗?我是否认为与数组大致相同会错吗? 我需要一个迭代器吧?我尝试过,max_element但一直出现错误? vector<int>::const_iterator it; it = max_element(cloud.begin(), cloud.end()); 错误:请求'cloud'中的成员'begin',这是非类类型'int [10]' 编辑:我无法回答自己的??? 所以我把它放在这里 哇,谢谢您的快速回复!我以这种方式结束了,觉得还好吗? for (unsigned int i = 0; i < cdf.size(); i++) if (cdf[i] < cdfMin) cdfMin = cdf[i]; cdf向量在哪里。
123 c++  vector  max  min 

7
C ++中的“ X未命名类型”错误
我有两个声明如下的类: class User { public: MyMessageBox dataMsgBox; }; class MyMessageBox { public: void sendMessage(Message *msg, User *recvr); Message receiveMessage(); vector<Message> *dataMessageList; }; 当我尝试使用gcc进行编译时,出现以下错误: MyMessageBox没有命名类型
123 c++  windows  types 

9
在哪里可以找到size_t的定义?
我看到了用这种类型定义的变量,但我不知道它来自哪里,也不知道它的目的是什么。为什么不使用int或unsigned int?(其他“相似”类型呢?Void_t等)。
123 c++  c  variables 

7
为什么std :: queue :: pop不返回值?
我浏览了此页面,但无法获得相同的原因。那里提到 “更明智的做法是,它根本不返回任何值,并要求客户端使用front()来检查队列前端的值” 但是从front()检查元素还需要将该元素复制到左值中。例如在此代码段中 std::queue<int> myqueue; int myint; int result; std::cin >> myint; myqueue.push (myint); / *此处将在RHS上创建临时文件,并将其分配给结果,如果通过引用返回,则在弹出操作之后结果将变为无效* / result = myqueue.front(); //result. std::cout << ' ' << result; myqueue.pop(); 在第五行,cout对象首先创建myqueue.front()的副本,然后将其分配给结果。所以,有什么不同,pop函数可以做同样的事情。
123 c++  stl 

4
C ++项目组织(带有gtest,cmake和doxygen)
我是编程的新手,所以我决定从用C ++创建一个简单的矢量类开始。但是,我想从一开始就养成良好的习惯,而不是稍后再尝试修改我的工作流程。 我目前只有两个文件vector3.hpp和vector3.cpp。随着我对一切的熟悉,这个项目将开始慢慢发展(使它更多地成为通用的线性代数库),因此我想采用“标准”项目布局,以使以后的生活更轻松。因此,环顾四周后,我发现了两种组织hpp和cpp文件的方法,第一种是: project └── src ├── vector3.hpp └── vector3.cpp 第二个是: project ├── inc │ └── project │ └── vector3.hpp └── src └── vector3.cpp 您会推荐哪个?为什么? 其次,我想使用Google C ++测试框架对我的代码进行单元测试,因为它似乎很容易使用。您是否建议将此与我的代码捆绑在一起,例如在inc/gtest或contrib/gtest文件夹中?如果捆绑在一起,您是否建议使用fuse_gtest_files.py脚本来减少数量或文件数量,或者保持原样?如果不捆绑在一起,该依赖性如何处理? 在编写测试时,通常如何组织这些测试?我当时想为每个类创建一个cpp文件(test_vector3.cpp例如),但是全部编译成一个二进制文件,以便它们可以轻松地一起运行? 由于gtest库通常是使用cmake和make构建的,所以我认为对我的项目也这样构建有意义吗?如果我决定使用以下项目布局: ├── CMakeLists.txt ├── contrib │ └── gtest │ ├── gtest-all.cc │ └── gtest.h ├── docs │ └── Doxyfile ├── inc …
123 c++  cmake  doxygen  googletest 


13
如何在编译时驱动C#,C ++或Java编译器来计算1 + 2 + 3 +…+ 1000?
在最近的一次采访中,有人问我一个非常奇怪的问题。面试官问我如何仅使用编译器功能来计算1 + 2 + 3 + ... + 1000。这意味着我不允许编写程序并执行它,但是我只应该编写一个程序,该程序可以驱动编译器在编译时计算此和,并在编译完成时打印结果。作为提示,他告诉我,我可能会使用编译器的泛型和预处理器功能。可以使用C ++,C#或Java编译器。有任何想法吗??? 这个问题与此处未询问任何循环的求和无关。另外,应该注意,总和应该在编译期间计算。使用C ++编译器指令仅打印结果是不可接受的。 阅读有关发布的答案的更多信息后,我发现使用C ++模板在编译过程中解决问题称为metaprogramming。这是Erwin Unruh博士在标准化C ++语言的过程中偶然发现的一项技术。您可以在meta-programming的Wiki页面上阅读有关此主题的更多信息。似乎可以使用Java注释用Java编写程序。您可以在下面查看maress的答案。 关于用C元编程++一个很好的书是这一个。如果有兴趣的话值得一看。 Boost的MPL 这个链接是一个有用的C ++元编程库。

10
在C ++中正确使用堆栈和堆?
我已经编程了一段时间了,但主要是Java和C#。我从来没有真正需要自己管理内存。我最近开始用C ++进行编程,对于何时将内容存储在堆栈上以及何时将它们存储在堆上,我有些困惑。 我的理解是,经常访问的变量应该存储在堆栈和对象中,很少使用的变量以及大型数据结构都应该存储在堆中。这是正确的还是我不正确的?

7
结合使用C ++和Cocoa而非Objective-C?
我想编写使用C ++和Cocoa框架的应用程序,因为Apple并未使Carbon具备64位功能。C ++在Linux和Windows上的实现似乎很原始,但在Mac OS X上似乎需要附加的Apple特定代码段(如Obj-C包装程序)。尽管我可能错了,但苹果似乎也在强迫开发人员使用Objective-C而不是C ++进行编写。 我正在尝试寻找一种在Mac上编写代码的方法,该方法很容易保持跨平台。必须为Linux / Windows用C ++编写代码,然后再用Objective-C重写大部分代码,效率非常低下。 有没有一种方法可以用C ++编写将来会受Xcode支持的代码?另外,如果有可能,我该如何在Xcode中混合使用C ++和Objective-C?谢谢。

3
使用此指针会在热循环中引起奇怪的反优化
最近,我遇到了一个奇怪的取消优化(或者说错过了优化机会)。 考虑使用此函数可以有效地将3位整数的数组拆包为8位整数。它在每次循环迭代中解压缩16个整数: void unpack3bit(uint8_t* target, char* source, int size) { while(size > 0){ uint64_t t = *reinterpret_cast<uint64_t*>(source); target[0] = t & 0x7; target[1] = (t >> 3) & 0x7; target[2] = (t >> 6) & 0x7; target[3] = (t >> 9) & 0x7; target[4] = (t >> 12) & 0x7; …


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.