Questions tagged «c++»

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

8
连接两个向量的最佳方法是什么?
我正在使用多重踩踏,并且想要合并结果。例如: std::vector<int> A; std::vector<int> B; std::vector<int> AB; 我希望AB必须按此顺序处理A的内容和B的内容。做这样的事情最有效的方法是什么?
189 c++  vector 

4
为什么要在C ++中使用嵌套类?
有人可以将我引向一些不错的资源来理解和使用嵌套类吗?我有一些像《编程原理》之类的材料,以及诸如《IBM Knowledge Center-Nested Classes》之类的东西。 但是我仍然很难理解他们的目的。有人可以帮我吗?



5
在C ++ Map中插入vs Emplace vs operator []
我第一次使用地图,我意识到有很多插入元素的方法。您可以使用emplace(),operator[]或者insert(),再加上喜欢使用的变体value_type或make_pair。尽管关于它们的信息很多,也有关于特定案例的问题,但我仍然无法理解大局。因此,我的两个问题是: 他们每个人比其他人有什么优势? 是否有需要将Emplace添加到标准中?没有它,有什么是不可能的吗?

10
如果按概率排序if ... else if语句有什么作用?
具体来说,如果我有一系列if... else if语句,并且我以某种方式预先知道每个语句将求和的相对概率,true那么按概率顺序对它们进行排序会在执行时间上造成多少差异?例如,我是否应该这样: if (highly_likely) //do something else if (somewhat_likely) //do something else if (unlikely) //do something 为此?: if (unlikely) //do something else if (somewhat_likely) //do something else if (highly_likely) //do something 显然,排序后的版本会更快,但是出于可读性或副作用的考虑,我们可能希望对它们进行非最佳排序。在实际运行代码之前,很难说出CPU在分支预测方面的表现如何。 因此,在尝试这一过程中,我最终针对特定案例回答了自己的问题,但是我也想听听其他意见/见解。 重要说明:该问题假设if语句可以任意重新排序,而对程序的行为没有任何其他影响。在我的回答中,这三个条件测试是互斥的,不会产生副作用。当然,如果必须以某种顺序对语句进行评估才能实现某些所需的行为,那么效率问题就不那么重要了。

5
函数模板的默认模板参数
为什么只在类模板上允许使用默认模板参数?为什么我们不能在成员函数模板中定义默认类型?例如: struct mycclass { template<class T=int> void mymember(T* vec) { // ... } }; 相反,C ++强制仅在类模板上允许使用默认模板参数。
187 c++  templates 


9
如何将CMake输出转换为“ bin”目录?
我目前正在使用插件结构构建一个项目。我正在使用CMake编译项目。插件在单独的目录中编译。我的问题是CMake会在源的目录结构中编译并保存二进制文件和插件,动态库。如何使CMake将文件保存在./bin目录中?
187 c++  plugins  cmake 


21
如何在C ++中将枚举用作标志?
通过将enums当作标志在C#中很好地工作[Flags]属性,但是在C ++中实现此目标的最佳方法是什么? 例如,我想写: enum AnimalFlags { HasClaws = 1, CanFly =2, EatsFish = 4, Endangered = 8 }; seahawk.flags = CanFly | EatsFish | Endangered; 但是,我得到有关int/ enum转换的编译器错误。有没有比钝铸更好的表达方式了?最好,我不想依赖来自第三方库的构造,例如boost或Qt。 编辑:如答案所示,我可以通过声明seahawk.flags为来避免编译器错误int。但是,我希望有一些机制来强制类型安全,所以有人不能写seahawk.flags = HasMaximizeButton。
187 c++  enums 

16
如何在仅具有受保护或私有构造函数的类上调用:: std :: make_shared?
我的这段代码行不通,但我认为目的很明确: testmakeshared.cpp #include <memory> class A { public: static ::std::shared_ptr<A> create() { return ::std::make_shared<A>(); } protected: A() {} A(const A &) = delete; const A &operator =(const A &) = delete; }; ::std::shared_ptr<A> foo() { return A::create(); } 但是在编译时会出现此错误: g++ -std=c++0x -march=native -mtune=native -O3 -Wall testmakeshared.cpp In file included from …
187 c++  c++11  shared-ptr 

3
fork()分支比预期更多?
考虑以下代码: #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i = 0; i < 2; i++) { fork(); printf("."); } return 0; } 该程序输出8个点。那怎么可能呢?应该不应该有6个点?
186 c++  c  fork 

4
是什么使i = i ++ +1; 在C ++ 17中合法吗?
在开始大叫未定义的行为之前,N4659(C ++ 17)中明确列出了它。 i = i++ + 1; // the value of i is incremented 但是在N3337(C ++ 11)中 i = i++ + 1; // the behavior is undefined 发生了什么变化? 从我可以收集的资料中,从[N4659 basic.exec] 除非另有说明,否则对单个运算符的操作数和单个表达式的子表达式的求值是无序列的。运算符的操作数的计算在运算符结果的值计算之前进行排序。如果相对于同一存储位置上的另一副作用或使用同一存储位置中任何对象的值进行的值计算相对于一个存储位置的副作用是未排序的,并且它们潜在地不是并发的,则该行为是不确定的。 其中值是在定义[N4659 basic.type] 对于平凡可复制的类型,值表示形式是对象表示形式中确定值的一组位,该值是实现定义的一组值中的一个离散元素 从[N3337 basic.exec] 除非另有说明,否则对单个运算符的操作数和单个表达式的子表达式的求值是无序列的。运算符的操作数的计算在运算符结果的值计算之前进行排序。如果相对于同一标量对象上的另一副作用或使用同一标量对象的值进行的值计算,未对标量对象的副作用进行排序,则该行为未定义。 同样,值在[N3337 basic.type]中定义 对于普通可复制类型,值表示形式是对象表示形式中确定值的一组位,该值是实现定义的一组值中的一个离散元素。 除了提及并发无关紧要,并且使用内存位置而不是标量对象外,它们是相同的 算术类型,枚举类型,指针类型,指向成员类型的指针std::nullptr_t以及这些类型的cv限定版本统称为标量类型。 这不影响示例。 来自[N4659 expr.ass] 赋值运算符(=)和复合赋值运算符均从右到左分组。它们都需要一个可修改的左值作为其左操作数,并返回一个引用左操作数的左值。如果左操作数是位字段,则在所有情况下结果都是位字段。在所有情况下,赋值都在左右操作数的值计算之后和赋值表达式的值计算之前进行排序。右操作数在左操作数之前排序。 来自[N3337 expr.ass] 赋值运算符(=)和复合赋值运算符均从右到左分组。它们都需要一个可修改的左值作为其左操作数,并返回一个引用左操作数的左值。如果左操作数是位字段,则在所有情况下结果都是位字段。在所有情况下,赋值都在左右操作数的值计算之后和赋值表达式的值计算之前进行排序。 …


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.