草庐IT

Algorithm

全部标签

c++ - std::sort 如何仅使用迭代器实现交换操作?

我如何实现例如以下内容templatevoidSwap(ITERATORa,ITERATORb){...}因此Swap(a,b)交换a和b指向的值。换句话说:如何在不知道数据类型的情况下创建第三个变量? 最佳答案 有iter_swap只是为了那份工作:std::iter_swap(a,b);此外,如果您可以使用c++11,则可以使用decltype:std::remove_reference::typec=*a;*a=*b;*b=c; 关于c++-std::sort如何仅使用迭代器实现交

algorithm - 网格简化 : Edge Collapse Conditions

我正在尝试通过进行一系列边缘折叠来实现网格简化算法。目前,我正在遍历每个三角形,然后折叠最短边,算法稳定(不会越界)。但在一定程度上,它开始创建破损(孔)工件。确定边是否可折叠以使其不会导致非流形工件(或网格)的正确方法是什么?注意:我使用的是半边数据结构。此外,我不想使用任何外部库,如OpenMesh或CGAL。我有不使用它们的理由。 最佳答案 边缘塌陷有两个主要条件:连通性在折叠边的每一侧,只有一对边必须合并。这可以通过计算两个合并顶点的联合相邻顶点来检查(必须恰好有两个)。考虑以下红色边缘折叠的示例:橙色和青色边缘之间的三角形

.net - 创建通用哈希表 - C++

.NETFramework有一个Dictionary类,该类作为哈希表实现,并在恒定时间(O(1))内提供数据检索。我正在寻找C++中的类似实现。我知道std::map但在此数据检索中需要对数时间。在C++中是否有任何好的哈希表实现可以在恒定时间内检索数据?如果我自己编写,我将如何计算key的哈希码?与.NET一样,我想到了对类型使用GetHashCode()方法。templateclassDictionary{public:voidAdd(TKeykey,TValval){inthashCode=key.GetHashCode();/*....*/}}如果我确实喜欢上面的操作并且给定

c++ - STL 算法如何独立于 Iterator 类型工作?

STL算法如何独立于迭代器类型工作? 最佳答案 真的,他们只是工作。它们使用模板的一些非常基本的属性,有时称为静态多态性。如果您熟悉该术语,它本质上是一种鸭式输入形式。(如果它长得像鸭子,而且叫起来像鸭子,那一定是鸭子)技巧很简单。这是一个非常简单的例子:templatevoidsay_hello(constT&t){t.hello();}say_hello函数不关心它的参数是哪种类型。它不必从接口(interface)派生或做出任何其他类型的关于它是什么的“promise”。重要的是类型在这种情况下有效。我们对该类型所做的一切就是

c++ - Hackerrank购买演出门票优化

我几天前在一家公司的在线筛选测试中遇到了这个问题。问题说明如下:Therearenpeoplestandinginlinetobuyshowtickets.Duetohighdemand,thevenuesellsticketsaccordingtothefollowingrules:Thepersonattheheadofthelinecanbuyexactlyoneticketandmustthenexittheline.ifapersonneedstopurchaseadditionaltickets,theymustre-entertheendofthelineandwaitt

c++ - 优化浮点除法和转换操​​作

我有以下公式floatmean=(r+b+g)/3/255.0f;我想加快速度。有以下前提条件0所以如果我尝试使用这样一个事实>>8就像除以256并且我使用类似floatmean=(float)(((r+b+g)/3)>>8);这将始终返回0。有没有一种方法可以跳过代价高昂的float除法并最终得到介于0和1之间的平均值? 最佳答案 将除法预先转换为可乘常数:a/3/255与相同a*(1/(3*255))所以预先计算:constfloatAVERAGE_SCALE_FACTOR=1.f/(3.f*255.f)然后就去做floatme

c++ - 我可以通过 for_each <algorithm> 在 C++ 中的指针 vector 上调用 `delete` 吗?

假设我有一个std::vectorobjs(出于性能原因,我的指针不是实际的Objs)。我用obj.push_back(newObj(...));填充它反复。完成后,我必须delete被推回的元素。一种方法是这样做:for(std::vector::iteratorit=objs.begin();it!=objs.end();++it){delete*it;}但是,如果我可以使用for_each我很感兴趣算法做同样的事情:#include...for_each(objs.begin(),objs.end(),delete);你怎么看? 最佳答案

c++ - 移动数组中的元素 C++

我为我的堆栈对象类开发了一种称为“旋转”的方法。我所做的是,如果堆栈包含元素:{0,2,3,4,5,6,7},我需要向前和向后旋转元素。如果我需要向前旋转2个元素,那么数组中会有{3,4,5,6,7,0,2}。如果我需要向后旋转,或-3个元素,那么,查看原始数组,它会是{5,6,7,0,2,3,4}所以我开发的方法工作正常。IMO的效率非常低下。我想知道是否可以使用mod运算符环绕数组?或者如果他们是我还没有意识到的无用代码,等等。我想我的问题是,如何简化此方法?例如使用更少的代码。:-)voidstack::rotate(intr){inti=0;while(r>0)//rotate

c++ - 查找连续出现次数最多的数字的算法 - C++

我需要帮助来制定解决一个问题的算法:有一行数字在该行中出现的次数不同,我需要找到出现次数最多的数字以及它在该行中出现的次数,例如:1-1-5-1-3-7-2-1-8-9-1-2那将是1,它出现了5次。算法应该很快(这是我的问题)。有什么想法吗? 最佳答案 您要找的是mode.您可以对数组进行排序,然后寻找最长的重复序列。 关于c++-查找连续出现次数最多的数字的算法-C++,我们在StackOverflow上找到一个类似的问题: https://stackov

c++ - if 条件的更好算法

我有一个代码,其中包含boolfn(){...//allthefollowingarebooleanfunctions.returnisTrue()&&isMsgReceived()&&isMsgSent();}问题在于每个返回的bool函数本身都非常冗长并且需要大量计算。实际上,如果前一个函数已经失败(和条件),则检查后续函数没有意义。您能否建议更简单的方法来返回false,以防万一开始的函数之一已经失败并且不再进行进一步检查。目的是减少计算时间。 最佳答案 &&已经为您做到了。如果isTrue()返回false,则不会评估接下来