草庐IT

c++ - 暴露复杂的短暂对象的正确方法

我正在开发Darwin进化论模拟。出于性能原因,它是用C++编写的。sim由World的一个实例表示。动物由Animal的实例表示,这是一个相当复杂的对象。World有两个重要的方法:animal_at(inti)和evolve(intn).animal_at返回一个非空原始指针,指向代表第i个动物的Animal实例。evolve推进模拟可能使animal_at返回的任何指针无效。我想让sim和动物可以从外面轻松访问。我有特定于python的绑定(bind),但我正在考虑学习CORBA或Ice来实现更通用的接口(interface)。问题是我应该如何暴露动物。我有两个想法,感觉都不满意

c++ - 具有两次递归调用的算法的复杂性

我有一个比被递归调用2次更奇怪的算法。这是intalg(intn)loopbody=Θ(3n+1)alg(n-1);alg(n-2)不知何故,我需要找到这个算法的复杂性。我试图通过使用上述方程的特征多项式来找到它,但结果系统太难求解,所以我想知道是否还有其他直接的方法.. 最佳答案 复杂性:alg(n)=Θ(φ^n)其中φ=黄金比例=(1+sqrt(5))/2起初我无法正式证明它,但经过一夜的工作,我找到了我遗漏的部分-替换方法减法低阶术语。对不起,我的证明表达不好(∵英语不好)。令循环体=Θ(3n+1)≦tn假设(猜测)cφ^n≤

c++ - 类设计复杂化(C++)

我的课是基础Derived_ADerived_B父级Child_Onechild_二Base有两个签名函数:virtualvoidfoo(constParent&)=0;virtualvoidbar(constBase&)=0;,程序的其他部分所期望的。问题是:Derived_A将Child_One和Child_Two视为相同。但是Derived_B以不同的方式对待它们。我应该如何实现?一种方法是找出传递给Derived_B.foo的对象类型。这显然是“设计缺陷”。我尝试的另一种方法是将签名函数更改为:classBase{classDerived_A;classDerived_B;//

c++ - C++中复杂结构的序列化

我正在尝试用C++序列化一组结构。这适用于除我的结构中包含的vector之外的所有数据。我可以将数据写入磁盘,然后将所有数据读回内存。唯一的问题是当我尝试访问vector的元素时出现段错误。我的代码如下。非常感谢任何帮助。写入磁盘的程序intmain{structStudentone;strcpy(one.FullName,"ErnestineWaller");strcpy(one.CompleteAddress,"824LarsonDrv,SilverSpring,MD20910");one.Gender='F';one.LivesInASingleParentHome=true;o

c++ - 降低 C++ 中的模板复杂性

最近,我一直在使用一种较少使用的STL功能-自定义分配器,我需要一些认真的帮助来减少我的语义开销。以无序映射的定义为例,它将文件名映射到一对整数的无序映射,并将shared_ptr映射到token,但使用自定义分配器。typedefstd::pairtoken_key_type;typedefstd::unordered_map,std::hash,std::equal_to,Allocator>>>filename_map_value_type;std::unordered_map,std::equal_to,Allocator>>tokens;那是404个字符的定义。然后要构造它,

c++ - 将可变类型列表的扩展打包到复杂类型的初始化列表中——这合法吗?

我想将可变类型列表“具体化”到相关值的initializer_list中。例如,有一个std::tuple几个std::integral_constant得到一个std::initializer_list{...}.在一般情况下,我想获得一些复杂类型的initializer_list,比如std::string.但是下面这个简单的例子让我在用Clang编译时崩溃了(尽管它适用于GCC,至少在Coliru上是这样),所以我怀疑是UB(或Clang中的错误):templatestd::initializer_listmaterialize(){return{std::to_string(T

c++ - 涉及逻辑与 (&&) 的复杂表达式

voidmain(void){intx,y,z;x=y=z=1;z=x&&y&&++z;//isthisfine?}我最近开始阅读有关序列点的资料,但我无法弄清楚上面的代码示例是否合适。我知道&&运算符引入了一个序列点,所以我不太确定表达式z=x&&y&&++z的行为。请有人告诉我正确答案。 最佳答案 在C++03中。voidmain(void){intx,y,z;x=y=z=1;//Seq1at;z=x&&y&&++z;//isthisfine?//Seq2at;}注意:请注意,运算符&&处有序列点,但这些点与本示例无关。很好!一

c++ - 如何在 C++ 中编码大型复杂常量数据结构

过去,我使用gcc的C99-stylecompound-literalextension到C++以在代码中编码嵌套常量数据结构。这是一个例子:#includeusingnamespacestd;structTree{constchar*name;constTree*left;constTree*right;};constTree*consttree=(Tree[]){"top",//name(Tree[]){"left",0,0},(Tree[]){"right",0,0}};staticvoiddump(constTree*tree){if(!tree){coutnameleft);

c++ - std::map 范围删除复杂度

cppreference.com表示std::map范围删除的复杂度是:log(c.size())+std::distance(first,last)而迭代器对单个元素的删除是摊销常量。因此,如果我在循环中删除元素:for(autoit=first;it!=last;it=map.erase(it));在std::distance(first,last)和cplusplus.com上应该是线性的同意这一点。标准怎么说?这只是cppreference.com上的拼写错误吗? 最佳答案 log(c.size())+std::distan

c++ - 复杂语言类型的内存管理

我在为静态类型的复杂语言编写内存管理时遇到了一个关于类型内部表示的小问题。考虑C++中的一个简单片段,它可以轻松演示引用自身的类型。classX{voidf(constX&){}};类型之间可以有近乎无限复杂的关系。那么,作为编译器进程,您如何确保它们被正确收集?到目前为止,我已经确定垃圾收集可能是正确的方法,但我对此不太满意,因为我想用C++编写编译器,或者干脆留下它们,从不收集它们在需要它们的编译阶段的生命周期内(具有非常固定的生命周期),然后将它们全部收集起来。这样做的问题是,如果您有很多复杂类型,那么您可能会丢失大量内存。 最佳答案