草庐IT

c++ - 将小的重叠 block 合并为较大的连续 block 的有效算法?

我面临一个相当有趣的问题。我有(相当大)数量的block。block只是从偏移量开始并具有长度和颜色的东西。偏移量和长度是有限的——这些block所在的空间是,其中N的范围从几十万到几百万。无效block是偏移量大于N或偏移量和长度之和大于N的任何block。block可能有大约16种不同的颜色(只是其中一种)。可能有几千block,总有这样的情况:block_X:off:100,len:50,color:blueblock_Y:off:148,len:50,color:blueblock_Z:off:200,len:30,color:red如您所见,X和Yblock可以连接成一个更大

c++ - 如何使用非常小的库或 native 代码 c/c++ 获取 MP3 文件(CBR 或 VBR)的持续时间?

我不能使用Fraunhofer获得专利的任何mp3代码,因此没有编码器或解码器(例如ffmpeg、lame、MAD等),而且它太大了。我在Windows上执行此操作,但DirectShow的IMediaDet似乎随着时间的推移变慢,调用它几百次使我的系统陷入爬行,甚至重新使用相同的接口(interface)对象并且只是输入文件名并获取持续时间!那么,是否有一些代码可以使用C/C++读取VBR文件并获取持续时间?这里有另一篇文章用C++做CBR,但是代码做了很多假设,当然不适用于VBR。 最佳答案 大多数MP3文件都有一个ID3hea

c++ - 在一个大文件上进行许多小的盲写的最快方法(在 C++ 中)?

我有一些非常大(>4GB)的文件,其中包含(数百万)固定长度的二进制记录。我想(有效地)通过将指针(即64位记录编号)写入特定偏移量的记录中,将它们连接到其他文件中的记录。为了详细说明,我有一对(键,记录号)元组列表,对于我想对给定文件对(例如A和B)执行的每个连接,键排序。遍历列表对并匹配向上键产生一个(键,记录号A,记录号B)表示连接记录的元组列表(为简单起见假设1:1映射)。为了完成连接,我在概念上需要查找列表中的每个A记录,并在适当的偏移处写入相应的B记录号,反之亦然。我的问题是实际执行此操作的最快方法是什么?由于连接记录的列表是按键排序的,因此关联的记录编号基本上是随机的。假

c++ - 为什么在堆上迭代一个大数组比在堆栈上迭代相同大小的数组更快?

我正在分配2个相同大小的数组,一个在堆栈上,一个在堆上,然后用简单的赋值遍历它们。可执行文件被编译为主线程堆栈分配40mb。此代码仅经过测试可在带有/STACK:41943040链接器标记的vc++中编译。#include"stdafx.h"#include#include#include#include#includeusingnamespacestd;size_tstackavail(){staticunsignedStackPtr;//topofstackptr__asmmov[StackPtr],esp//movpointertotopofstackstaticMEMORY_B

c++ - 如何从 C++ 处理 C 库中不同大小的类型

我有一个从C++链接到的外部C库。该库定义了一个使用bool的结构,并为C语言包含了一个typedef。问题是这个typedef使用int,所以(在我的平台上)不是这个大小为1字节的bool,而是4个字节。然后,当我#includeheader并在C++中创建结构时,bool(作为C++标准类型)的大小为1个字节,因此该结构具有完全不同的内存布局,当我将它传递给C库以便在那里修改它时,会导致各种堆栈损坏。有没有办法在不修改外部库的情况下解决这个问题?我想用C++编译器而不是C编译器编译外部库会起作用,对吗?这是我解决这个问题的唯一机会吗?库.h:#ifndef__cplusplusty

c++ - 手动编码的快速排序在较小的整数上较慢

当比较我的编译器上的快速排序实现与std::sort以及合并排序的实现时,我注意到大型数据集上的一个奇怪模式:当对64位整数进行操作时,快速排序始终比合并排序快;然而,在较小的int大小上,快速排序变得更慢,而合并排序变得更快。测试代码如下:#include#include#include#include#include#include#include#include#include#includetemplatevoidinsertion_sort(Iteratorfirst,Iteratorlast){usingnamespacestd;Iteratorhead=first;Ite

c++ - 任意大小的凸多边形之间的碰撞检测算法

我正在研究小行星克隆。一切都是二维的,用C++编写。对于小行星,我正在生成随机的N边多边形。我保证它们是凸的。然后我旋转它们,给它们一个旋转速度,让它们在太空中飞翔。一切正常,而且非常漂亮。对于碰撞,我使用的是我自己想到的算法。这可能是个坏主意,如果到了紧要关头,我可能会放弃整个事情并在互联网上找到教程。我已经编写并实现了所有内容,并且碰撞检测工作正常......大部分时间。当屏幕上有明显的碰撞时它会随机失败,并且有时在没有任何东西接触时指示碰撞。要么我在某个地方搞砸了我的实现,要么我的算法很糟糕。由于我实现的规模/范围(超过几个源文件),我不想为此打扰你,只是希望有人检查我的算法实际

c++ - 使用 opencv 复制/混合不同大小的图像

我正在尝试混合两个图像。如果它们具有相同的大小,这很容易,但是如果其中一个图像较小或较大,则cv::addWeighted会失败。图片A(预计会更大)图B(预计会更小)我试图创建一个ROI-试图创建A大小的第三个图像并在其中复制B-我似乎做不对。请帮忙。doublealpha=0.7;//somethingintmin_x=(A.cols-B.cols)/2);intmin_y=(A.rows-B.rows)/2);intwidth,height;if(min_x甚至像cvSetImageROI这样的东西-可能有用,但我找不到c++等价物-可能有帮助-但我不知道如何使用它来保留图像内容

c++ - 尾数较高的fp怎么能代表较小的数呢?

我爱FP;每次我想得到它,我都明白我对此一无所知:)This是一个我不明白的例子。我对相同的数字(0.1)求和8次,然后打印总和和“原始”的结果:std::cout.precision(100);intnumIteration=8;doublestep=0.1;doublesum=0.0;for(inti=0;i0.1存储为0.1000000000000000055511151231257827021181583404541015625,我希望在8和之后,它会被存储为大于或等于0.8,存储为0.8000000000000000444089209850062616169452667236

有序矩阵中第 K 小的元素

题目链接有序矩阵中第K小的元素题目描述注意点每行和每列元素均按升序排序找到一个内存复杂度优于O(n²)的解决方案解答思路使用二分查找,思路为:(1)因为左上角的元素值更小,右下角的元素值更大,先将left设置为左上角元素的值,right设置为右下角元素的值;(2)判断不大于left和right中间值mid的元素数量sum;(3)如果sum小于k,则将left设置为mid+1,否则将right设置为mid。不断重复上述过程,直到满足sum等于k时right的最小值,此时left等于right,且right是大于等于矩阵中K个元素的临界点,所以矩阵中一定会有一个元素等于right(否则说明并没有找