Questions tagged «c++»

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

7
在哪里可以了解有关C ++ 0x的更多信息?[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案能得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我想了解更多有关C ++ 0x的信息。有哪些好的参考资料和资源?有人写过关于这方面的好书吗?

10
去GC还是不去GC
我最近看了两个非常有趣且具有教育意义的语言讲座: Herb Sutter撰写的第一篇文章介绍了C ++ 0x的所有出色功能,凉爽的功能,为什么C ++的未来似乎比以往更加光明,以及M $在这场比赛中如何被称为好人。讨论围绕效率以及如何经常减少堆活动来提高性能。 另一位由Andrei Alexandrescu创作,激发了从C / C ++到他的新游戏改变者D的过渡。D的大多数工作似乎都动机和设计都很好。但是,令我感到惊讶的是,D推动了垃圾回收,并且所有类都是仅通过引用创建的。更令人困惑的是,《 D编程语言参考手册》一书在有关资源管理的章节中特别 指出以下内容: 垃圾回收消除了C和C ++中必需的繁琐且易于出错的内存分配跟踪代码。这不仅意味着更快的开发时间和更低的维护成本,而且生成的程序经常运行得更快! 这与Sutter关于减少堆活动的不断讨论相矛盾。我非常尊重Sutter和Alexandrescou的见解,因此我对这两个关键问题感到困惑 并非仅通过引用创建类实例会导致大量不必要的堆活动吗? 在哪些情况下可以使用垃圾回收而不牺牲运行时性能?

3
C ++:将一个操作数保留在寄存器中的速度大大提高
我一直在尝试通过定时使用以下代码对数组元素进行缩放和求和的例程来了解在L1缓存中存储数组对内存的影响(我知道我应该将结果按'最后是a';关键是要在循环内进行乘法和加法-到目前为止,编译器尚未弄清楚要分解出'a'): double sum(double a,double* X,int size) { double total = 0.0; for(int i = 0; i < size; ++i) { total += a*X[i]; } return total; } #define KB 1024 int main() { //Approximately half the L1 cache size of my machine int operand_size = (32*KB)/(sizeof(double)*2); printf("Operand size: %d\n", operand_size); …

5
为什么使用mingw gcc4.8.1的std :: random_device每次运行都得到相同的序列?
我使用以下代码来测试C ++<random>库。 为什么每次编译的可执行文件都会得到完全相同的序列?是rd()在编译时确定的?每次运行如何获得不同的输出? Windows 7 64位上的GCC 4.8.1。使用http://nuwen.net/mingw.html中的MinGW分发。 编辑:我用Visual Studio测试了相同的代码。没有问题。输出是不确定的。这可能是我使用的mingw gcc 4.8.1中的错误。 #include <iostream> #include <random> using namespace std; int main(){ random_device rd; mt19937 mt(rd()); uniform_int_distribution<int> dist(0,99); for (int i = 0; i< 16; ++i){ cout<<dist(mt)<<" "; } cout <<endl; }
70 c++  c++11  random  stl 


8
复杂的C声明
我只是在浏览Internet上的一些代码后发现: float * (*(*foo())[SIZE][SIZE])() 我如何阅读此声明?是否有一组特定的规则来读取这种复杂的声明?

22
如何获得两个数组之间的交集作为新数组?
在各种情况下,我多次面对这个问题。尽管我熟悉C或Java,但它对所有编程语言都是通用的。 让我们考虑两个数组(或集合): char[] A = {'a', 'b', 'c', 'd'}; char[] B = {'c', 'd', 'e', 'f'}; 如何获得两个数组之间的公共元素作为新数组?在这种情况下,数组A和B的交集为char[] c = {'c', 'd'}。 我想避免一个数组在另一个数组内的重复迭代,这将使执行时间增加(A的长度乘以B的长度),这对于大型数组而言实在太多了。 有什么方法可以在每个数组中进行一次传递来获取公共元素?
70 java  c++  c  algorithm 

11
使用C ++ 11进行重构
鉴于c ++提供了许多程序员的新工具集,其目的是简化代码,表达性,提高效率,浏览旧代码并进行调整(有些毫无意义,有些成功)以实现其目标。在尝试不花太多时间从事此类工作并且仅进行非侵入性且自成一体的更改时,最佳实践是什么? 让我删掉显而易见的内容: 使用auto运行基于迭代器的循环: for (std::vector<foo>::const_iterator it(lala.begin()), ite(lala.end()); it != ite; ++it); // becomes for (auto it(lala.cbegin()), ite(lala.cend()); it != ite; ++it); 将tie用于仅产生C样式代码行的多个分配(如何一次将多个值分配给一个结构?) a = 1; b = 2; c = 3; d = 4; e = 5; // becomes std::tie(a, b, c, d, e) = std::make_tuple(1, 2, 3, 4, …
70 c++  c++11  refactoring 


3
为什么我必须写std :: cout而不是std :: <<
为什么我必须编写std::cout而不是std::&lt;&lt;像下面这样的代码行: #include &lt;iostream&gt; int main() { std::cout &lt;&lt; "Hello, world!"; return 0; } cout来自std库,&lt;&lt;通常不用于移位吗?那么,为什么我也不必::在之前也写作用域运算符&lt;&lt;,因为它也有其他含义?编译器如何知道在之后std::cout,&lt;&lt;意味着另一件事?
70 c++ 

9
C ++:结构可以从类继承吗?
我正在查看我正在使用的API的实现。 我注意到结构是从类继承而来的,我停下来思考一下…… 首先,我没有在研究的C ++手册中看到某个结构可以从另一个结构继承: struct A {}; struct B : public A {}; 我猜想在这种情况下,结构B继承了结构A中的所有数据。我们可以在结构中声明公共/私有成员吗? 但是我注意到了这一点: class A {}; struct B : public A {}; 从我的在线C ++手册中: 类是一数据结构的一个扩展的概念:不是只持有数据,它可以容纳两个数据和功能。 即使类A具有某些成员函数,上述继承也有效吗?当结构继承它们时,函数会发生什么?而相反呢:从结构继承的类呢? 实际上,我有这个: struct user_messages { std::list&lt;std::string&gt; messages; }; 而且我经常这样迭代foreach message in user_messages.messages。 如果要向结构中添加成员函数,是否可以更改其声明并将其“提升”为类,添加函数,并且仍然像以前一样遍历user_messages.messages? 显然,我仍然是新手,我仍然不清楚结构和类之间如何交互,两者之间的实际区别是什么,继承规则是什么...

4
C ++ lambda表达式的生命周期是多少?
(我已经阅读了lambda派生的隐式函子在C ++中的寿命是什么?并且它不能回答这个问题。) 我知道C ++ lambda语法只是使用调用运算符和某些状态创建匿名类的实例的糖,并且我了解该状态的生存期要求(由您是否通过按引用的值捕获来确定。) Lambda对象本身的生命周期?在以下示例中,std::function返回的实例是否有用? std::function&lt;int(int)&gt; meta_add(int x) { auto add = [x](int y) { return x + y; }; return add; } 如果是,它将如何工作?对我来说,这似乎太神奇了-我只能通过std::function复制整个实例来想象它能工作,这取决于我捕获的内容,可能非常繁琐-过去我std::function主要使用裸函数指针,而复制这些实例是快。鉴于std::function类型的擦除,这似乎也有问题。
70 c++  lambda  c++11 


4
移动向量会使迭代器无效吗?
如果我在vector中有一个迭代器a,那么我b从中移动向量或移动分配向量a,该迭代器是否仍指向同一元素(现在在vector中b)?这就是我在代码中的意思: #include &lt;vector&gt; #include &lt;iostream&gt; int main(int argc, char *argv[]) { std::vector&lt;int&gt;::iterator a_iter; std::vector&lt;int&gt; b; { std::vector&lt;int&gt; a{1, 2, 3, 4, 5}; a_iter = a.begin() + 2; b = std::move(a); } std::cout &lt;&lt; *a_iter &lt;&lt; std::endl; // Is a_iter valid here? return 0; } 是否a_iter仍然有效的,因为a已移入b,或者是通过招无效的迭代器?供参考,std::vector::swap 不会使迭代器无效。
70 c++  iterator  c++11 


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.