草庐IT

c++ - 为什么在树中插入顺序元素比在树中插入随机元素需要更多时间?

这不是作业我正在上数据结构课,我们最近完成了树。下课时,我的教授展示了这张图片。ConcreteBTree是一种不自平衡的二叉树。我对完成这些程序所花费的时间有一些疑问。为什么将100,000个顺序元素插入ConcreteBTree所花费的时间比将随机元素插入其中所花费的时间多得多?我的直觉是,由于元素是连续的,因此插入1,000,000个随机元素所需的时间应该更少。为什么随机元素的ConcreteBTree的insert()和find()的时间相差这么近?是因为两者具有相同的时间复杂度吗?我以为insert是O(1)而find是O(n)我真的很想了解这里发生了什么,任何解释将不胜感激

c++ - 使用非 const 指针调用函数比使用指向 const 的指针的函数更像是一个模板函数

以下代码是在g++4.1.2和g++4.4.4上编译的。两者都给出了评论中注明的结果。intf(constint*a){return0;}templateintf(Aa){return1;}intmain(){intx;//returnf(&x);//returns1returnf((constint*)&x);//returns0}它似乎归结为调用f(int*)解析为f(int*)而不是预期的f(constint*).我发现这令人震惊并且完全不符合直觉。这是g++中的一个错误,C++的一个黑暗角落,还是由于某种原因我遗漏了?如果它不是错误,它背后的理论或逻辑是什么?关于这个问题有什么

c++ - 在 C++ 中,为什么编译许多小文件比编译大文件要花费更长的时间?

我最近将我的C++项目中的一些非常大的文件拆分成许多较小的文件(基本上每个类一个文件)。这使编译时间增加了一倍以上,并将生成的可执行文件从1.6mb扩大到2.4mb。为什么这会产生如此巨大的变化?这是不是必须在很多文件中包含几个header而不是几个header的直接结果?编译器选项:g++-Wall-Wextra-g-ggdb-std=c++0x我指的可执行文件大小是在运行strip-s可执行文件之后。尺寸:调试符号前:16MB使用调试符号后:26MB没有调试符号之前:1.5MB没有调试符号后:2.4MB附加问题:我已经通过将header放在pch.hpp中然后在我的g++标志中使用

c++ - Push_back 比 insert 快?

我正在使用std::deque。我确信用单个insert替换带有push_back的循环会提高性能。也推荐,比如here.但现在我不再那么确定了。我对测试代码运行了一些基准测试。主要.cpp:#include"queueInsert.h"#includestd::dequequeue;constexprsize_tlen=64;intarr[len];intmain(){DWORDstartTime=GetTickCount();for(inti=0;i队列插入.h:#includevoidinsert(std::deque&,int*arr,intn);queueInsert.cpp

c++ - 比 ADL 更喜欢一些功能

我想使用基于范围的for来迭代UTF8编码的std::string中的unicode代码点。我在全局命名空间中定义了自己的begin和end但中的begin和endstd命名空间是首选(即那些由ADL找到的)。有什么办法可以更喜欢我自己的功能吗?例子:constchar*begin(conststd::string&s){std::cout我希望它打印BEGINENDasdf(或ENDBEGINasdf),但它打印asdf。除了使用限定名称手动for没有其他方法吗? 最佳答案 用你自己的类型包装std::string。通过将其设为模

c++ - g++ 比使用列表的 visual studio 慢 1000 倍?

考虑以下代码片段:#include#include#include#includeusingnamespacestd;#defineNUM_ITER100000intmain(){clock_tt=clock();std::listmy_list;std::vector::iterator>list_ptr;list_ptr.reserve(NUM_ITER);for(inti=0;i0){my_list.erase(list_ptr[list_ptr.size()-1]);list_ptr.pop_back();}cout当我使用visualstudio编译并运行它时,启用了所有优化

kotlin - 伴生对象比普通对象有什么优势?

Kotlin代码如下:classFoo{companionobject{funa():Int=1}funb()=a()+1}可以简单地改成objectFooStatic{funa():Int=1}classFoo{funb()=FooStatic.a()}我知道伴生对象可以用作真正的java静态函数,但是使用伴生对象还有其他优点吗? 最佳答案 主要区别之一是成员的可见性。在伴随对象中,包含类的可见性就像成员是类的一部分一样-对于原始对象而言并非如此。下面的例子表明你不能使用“对象”来实现类的私有(private)静态内部。packa

kotlin - 伴生对象比普通对象有什么优势?

Kotlin代码如下:classFoo{companionobject{funa():Int=1}funb()=a()+1}可以简单地改成objectFooStatic{funa():Int=1}classFoo{funb()=FooStatic.a()}我知道伴生对象可以用作真正的java静态函数,但是使用伴生对象还有其他优点吗? 最佳答案 主要区别之一是成员的可见性。在伴随对象中,包含类的可见性就像成员是类的一部分一样-对于原始对象而言并非如此。下面的例子表明你不能使用“对象”来实现类的私有(private)静态内部。packa

c++ - 为什么在这个递归斐波那契代码中 GCC 生成的程序比 Clang 更快?

这是我测试过的代码:#include#includeusingnamespacestd;#defineCHRONO_NOWchrono::high_resolution_clock::now()#defineCHRONO_DURATION(first,last)chrono::duration_cast>(last-first).count()intfib(intn){if(n当然,计算Fibonacci数的方法要快得多,但这是一个很好的小压力测试,侧重于递归函数调用。除了使用chrono来测量时间之外,代码没有其他内容。首先,我使用-O3优化在OSX上的Xcode中运行了几次测试(这

c++ - VS2008 二进制比 VS2005 慢 3 倍?

我刚刚将一个原生C++项目从VS2005-SP1升级到VS2008-SP1我测试的第一件事是对应用程序进行非常基本的功能测试,我注意到的第一件事是主要的数字运算算法在VS2008二进制文件中的执行速度慢了三倍。我再次测试了VS2005二进制文件,以确保没有任何其他差异,并且它仍然像以前一样执行。有没有人偶然发现这个? 最佳答案 最奇怪的。事物。曾经。好像是vs2008的项目升级向导根本就没有复制'Optimization="2"'属性,所以新项目在发布时没有优化。修复方法是转到属性对话框,将优化更改为1,然后再更改为2。再次编译,一