草庐IT

c++ - std::vector 比 std::unordered_set 更快?

在我的自定义物理引擎中,最大的瓶颈是从空间分区(二维网格)获取所有物体并返回仅包含指向物体的唯一指针的集合的方法。templateboolcontains(constT&mContainer,constV&mValue){returnstd::find(std::begin(mContainer),std::end(mContainer),mValue)!=std::end(mContainer);}constvector&GridInfo::getBodiesToCheck(){bodiesToCheck.clear();for(auto&query:queries)for(auto

c++ - 如何排序比 n log n 更快(给定列表上的强条件)?

我被问到以下问题(完全不知道如何解决它的方法)给定一个包含n个int的数组arr,我们需要对其进行排序。我们已经知道k个int被放置在原始arr中,就像在排序数组中一样。(只是不知道它们中的哪一个)他们说这样的排序比nlogn好得多——我不知道...有什么建议吗? 最佳答案 http://en.wikipedia.org/wiki/Radix_sort关键事实是您使用的是整数并且知道最大的键,这正是使用基数排序的时候,它的复杂度是线性的。还有第二种方法,如果它们中的k个已经排序,您可以使用某些版本的shell排序,其顺序将产生最佳结

c++ - C++11 委托(delegate)的 ctors 是否比调用 init 函数的 C++03 ctors 表现更差?

[这个问题已经过高度编辑;请原谅,我已将编辑内容移至下面的答案中]来自Wikipedia(subarticleincluded)在C++11上:This[newdelegatingconstructorsfeature]comeswithacaveat:C++03considersanobjecttobeconstructedwhenitsconstructorfinishesexecuting,butC++11considersanobjectconstructedonceanyconstructorfinishesexecution.Sincemultipleconstructor

c++ - 为什么斐波那契数列的这些动态编程实现中的一个比另一个更快?

我最近一直在研究各种Fibonacci算法并对其进行基准测试以供自己娱乐,并且或多或少偶然想到了经典O(n)时间和O(1)空间动态规划实现的替代实现。考虑以下两个函数:BigIntfib_dp_classic(intn){if(n==0){return0;}BigIntx=0,y=1,z;for(inti=2;i和BigIntfib_dp_mod(intn){BigIntx=0,y=1,z=1;for(inti=0;i在我的机器上,使用fib_dp_classic计算第100万斐波那契数需要6.55秒,使用fib_dp_mod需要2.83秒,即使打开-O3也不会改变太多。关于为什么mo

javascript - 当 asm.js 比普通 JS 代码更快时,我为什么要在 JS 中编写新代码?

Emscripten可以从C/C++生成比手工编写的JS代码更快的代码,那么这是否意味着我们应该用C/C++编写新代码并编译它们以在Web上运行?我读了Emscripten常见问题解答,它说“一定要编写新的JavaScript代码。”,这是为什么呢? 最佳答案 asm.js并不是执行Javascript类代码的更快方法。这是一种运行代码的更快方法,该代码已经被简化为机器代码的抽象级别。您似乎大大高估了yield:如果您让JS开发人员将C++当作JS来编写,您最终会得到错误代码,其速度远不如C++快,并且在其他方​​面也存在缺陷。许多

c++ - 为什么指针访问比 vector::iterator 访问慢? (编译器代码生成)

好吧,问题标题有点蹩脚,但我真的不知道如何更好地表达这个问题。我遇到的问题是给定一个std::vector与T*+size_tcount我的编译器(VisualStudio2005/VC++8)在指针上循环时实际上会生成比在vector上循环时更糟糕的代码。也就是说,我有一个包含vector的测试结构和另一个包含指针+计数的测试结构。现在,当编写语义上完全相同的循环结构时,带有std::vector的版本比带有指针的版本快显着(也就是说>10%)。您将在下面找到代码以及生成的程序集。如果有人可以解释这里发生了什么,那就太好了。如果您查看程序集,您会注意到原始指针版本如何生成稍微多一些的

c++ - 为什么我的析构函数似乎比构造函数更频繁地被调用?

#includeusingnamespacestd;classA{public:staticintcnt;A(){++cnt;cout程序会输出:constructor:1destructor:0destructor:-1destructor:-2构造函数和析构函数不是成对出现的吗? 最佳答案 您需要添加一个增加计数器的复制构造函数。A(constA&){++cnt;cout如果您没有显式添加它,编译器会生成一个不对计数器cnt执行任何操作的计数器。这个表达式Aa1=f(a0);正在创建a0的拷贝,它使用了复制构造函数。确切的份数可

c++ - std::map: find(key)->second 比 [] 运算符快吗?

std::mapx;x[5]=1.2;doubley=x[5];doublez=x.find(5)->second;这2个分配中的一个会比另一个执行得更快吗?(假设请求的键始终存在于映射中)在执行x.find(5)->second时,是否存在与迭代器取消引用相关的任何开销?编辑:感谢您的回复。在我的特定函数中,既然我知道它并不慢,我可能会使用x.find(5)->second因为我需要标记我的函数const(map是一个成员变量)并且[]运算符显然不允许这样做(因为它可能会修改map,因为缺少一个键)。 最佳答案 这没有回答您的问题

c++ - 为什么 ostringstream 比 ofstream 快

要将多条数据写入文件,我有两种方法:直接一个一个写入ofstreamofstreamfile("c:\\test.txt");for(inti=0;i先写入istringstream,然后一次性写入ofstreamostringstreamstrstream;for(inti=0;i毫不奇怪,第二种方法更快,事实上,在我的HP7800机器上,它比第一种方法快4倍。但是为什么?我知道ofstream在内部使用filebuf,而ostringstream使用stringbuf-作为缓冲区,它们都应该驻留在内存中,因此应该没有区别。引擎盖下有什么区别? 最佳答案

c++ - gcc 的 -Wconversion 是否与使用比 int 短的整数类型的复合赋值(+= 等)不兼容?

gcc有一个有用的标志-Wconversion当存在从较宽类型到较窄类型的隐式转换时会产生警告,可能会丢失信息。不幸的是,它有以下......无用的......行为。考虑这个程序:intmain(void){shortx=1;x=x+x;return0;}用-Wconversion编译产生nonsense.c:Infunction'main':nonsense.c:3:8:warning:conversionto'shortint'from'int'mayalteritsvalue[-Wconversion]这很公平;在大多数平台上,如果发生x==0x8000,这将执行您可能意想不到的