草庐IT

c++ - 与 (N)RVO 一起有效使用 move 语义

假设我想实现一个函数,该函数应该处理一个对象并返回一个新的(可能已更改的)对象。我想在C+11中尽可能高效地执行此操作。环境如下:classObject{/*ImplementationofObject*/Object&makeChanges();};我想到的备选方案是://Firstalternative:Objectprocess1(Objectarg){returnarg.makeChanges();}//Secondalternative:Objectprocess2(Objectconst&arg){returnObject(arg).makeChanges();}Objec

c++ - std::vector<T>::resize( n, val ) 是否足以进行初始化?

这是一个特定于C++11的问题。假设我有一个vectorstd::vectorv已经使用过,我想将其调整为n使用现有值初始化的元素Tval.(典型用例:vector是被回收实例的成员)。以下几种方式各有什么优缺点,哪种方式效率最高?1)是std::vector::resize(n,val)足以进行初始化吗?v.clear();v.resize(n,val);2)如果不是,那么我假设以下是正确的?v.clear();v.resize(n);std::fill(v.begin(),v.end(),val);3)交换怎么样?v.swap(std::vector(n,val));

c++ - 为什么我的 n log(n) 堆排序比我的 n^2 选择排序慢

我已经实现了两种算法来对元素进行从高到低的排序。第一个在实际RAM模型上花费二次时间,第二个花费O(nlog(n))时间。第二个使用优先级队列来减少。这里是时间,是上述程序的输出。第一列是随机整数数组的大小第二列是O(n^2)技术的时间(以秒为单位)第三列是O(nlog(n))技术的时间(以秒为单位)96001.926637.5886598001.937057.67376100002.086478.19094尽管复杂性存在巨大差异,但就所考虑的数组大小而言,第3列大于第2列。为什么会这样?C++实现优先级队列慢吗?我在Windows7、VisualStudio201232位上执行了这段

c++ - 使用模板 "f(int[4][4])"时没有 "void f(int x[M][N])"的匹配函数?

#includetemplatevoidprint1(intsrc[M][N]){}voidprint2(intsrc[4][4]){}intmain(){intsrc[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16},};print1(src);//giveserror//error:nomatchingfunctionforcallto'print1(int[4][4])'print2(src);//works!}在上面的代码中,print2()按预期工作,但是print1()给我错误error:nomatchingfunct

N!的C++算法订单

我有一个包含N项的列表,我想知道如何遍历该列表以获得每个组合。没有double,所以我需要得到所有的N!订单。额外的内存没问题,我正在尝试考虑最简单的算法,但我遇到了麻烦。 最佳答案 参见std::next_permutation 关于N!的C++算法订单,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2141929/

c++ - 降低 o(n^3) c++ 代码的复杂性

我想降低以下算法的复杂性。基本上,它以一个词作为输入并计算其中唯一字母的数量(该词的“熵”)。我当前的解决方案采用3个嵌入式for循环,复杂度为o(n^3)。由于这段代码是一个更大项目的一部分(我们为名为boggle的游戏构建了一个求解器),我希望降低算法的复杂性以减少其执行时间。提前致谢!intwordEntropy(stringword){intlength=word.length();intuniquewords=length;stringcompare=word;charsave[17];intcond=0;for(intii=0;ii0){break;}uniquewords

c++ - `std::tuple<int[N]>` 有什么用?

此处(https://stackoverflow.com/a/37550660/34509)用户@Barry可以在评论区备注std::tuple并且显然不禁止实例化这种类型。我还没有听说过这个野兽,我想知道它有什么用,而不是存储intvar[2]直接或使用std::array.据报道,std::tuple不可复制,不可移动,也不可从intvar[2]构造.它还有什么其他用途? 最佳答案 我很确定这是未定义的行为。请参阅Requires和Returns子句:tuple.creation-10and12说:Requires:Forall

c++ - 生成第 n 个 Motzkin 数的最快方法是什么?

我想生成所有MotzkinNumber并存储在一个数组中。公式如下:我目前的实现速度太慢了:voidgenerate_slow(){mm[0]=1;mm[1]=1;mm[2]=2;mm[3]=4;mm[4]=9;ullresult;for(inti=5;i此外,我一直在寻找递归矩阵的封闭形式,以便我可以应用指数平方。谁能建议一个更好的算法?谢谢。编辑我无法应用第二个公式,因为除法在对数字取模时不适用。n的最大值为10,000,超出了64位整数的范围,因此答案是对更大的数m取模,其中m=10^14+7。不允许使用更大的整数库。 最佳答案

适合在动态有序列表中查找第 n 个元素的 C++ STL 容器?

使用像AVL或Red-Black-Tree这样的平衡BST,我们可以轻松维护一组值:插入/删除/查询给定值。计算小于/大于给定值的元素。排序后找到秩为k的元素。以上所有内容都可以在O(logN)复杂度中归档。我的问题是,是否有任何STL容器以相同的复杂度支持上述所有3个操作?我知道STLset/multiset可用于1和2。我检查了基于_Rb_tree的容器map/set/multiset,但没有一个提供对3的支持。是否有子类化ext/rb_tree的方法来解决这个问题? 最佳答案 您要查找的数据结构是orderstatistict

c++ - T D[N] 是否总是声明数组类型的对象?

我对[dcl.array]/1感到困惑:InadeclarationTDwhereDhastheform          D1[constant-expressionopt]attribute-specifier-seqoptandthetypeoftheidentifierinthedeclarationTD1is“derived-declarator-type-listT”,thenthetypeoftheidentifierofDisanarraytype;...考虑声明:int(*p)[42];这个声明满足上面描述的语法(不满足前面段落描述的语法),所以这个段落应该适用,因此