小编Yve*_*ust的帖子

初始化零数组

众所周知,标量数组的缺少初始值设定值默认为零.

int A[5]; // Entries remain uninitialized
int B[5]= { 0 }; // All entries set to zero
Run Code Online (Sandbox Code Playgroud)

但是这(下面)保证了吗?

int C[5]= { }; // All entries set to zero
Run Code Online (Sandbox Code Playgroud)

c++ arrays initialization language-lawyer

53
推荐指数
3
解决办法
3万
查看次数

C ++中的有效整数下限函数

我想定义一个有效的整数下限函数,即从float或double转换为向负无穷大执行截断。

我们可以假设这些值使得没有整数溢出发生。到目前为止,我有一些选择

众所周知,将数据类型转换为int很慢。如果测试也是如此。我尚未设置发言权功能的时间,但是看到帖子声称它也很慢。

您能在速度,准确性或允许范围方面考虑更好的替代方法吗?它不需要是便携式的。目标是最新的x86 / x64体系结构。

c++ performance x86-64 processing-efficiency floor

32
推荐指数
2
解决办法
3847
查看次数

使用AVX模拟32字节的移位

我正在将使用SSE2内在函数编写的矢量化代码迁移到AVX2内在函数.

令我失望的是,我发现移位指令_mm256_slli_si256_mm256_srli_si256仅分别在AVX寄存器的两半上运行,并且在它们之间引入了零.(这与处理整个SSE寄存器的_mm_slli_si128_mm_srli_si128相反.)

你能推荐我一个简短的替代品吗?

更新:

_mm256_slli_si256 有效地实现了

_mm256_alignr_epi8(A, _mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 3, 0)), N)

要么

_mm256_slli_si256(_mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 3, 0)), N)

对于大于16字节的移位.

但问题仍然存在_mm256_srli_si256.

c++ simd intrinsics sse2 avx2

11
推荐指数
2
解决办法
2881
查看次数

#include指令中的宏替换

我想使用一个#include带有文件名的指令,该指令作为外部定义的宏传递.

例如

#include #FILE".h"
Run Code Online (Sandbox Code Playgroud)

where FILE将被定义为字符串MyFile(不带引号),从而导致

#include "MyFile.h"
Run Code Online (Sandbox Code Playgroud)

此处不能使用字符串化运算符#,因为符号FILE不是宏参数.我尝试过其他方法,但无济于事.

你看到了解决方案吗?

include stringification c-preprocessor

10
推荐指数
1
解决办法
1016
查看次数

找到所有空三角形

N在飞机上有一小组点,N < 50.

我想枚举集合中所有三点的点,形成一个不包含其他点的三角形.

即使明显的蛮力解决方案对我的微小也是可行的N,但它具有复杂性O(N^4).

您是否知道一种降低时间复杂度的方法,比方说O(N³)O(N²)保持代码简单?没有图书馆允许.


令我惊讶的是,这种三角形的数量相当大.将任意点作为中心,并通过增加其周围的角度来对其他点进行排序.这形成一个星形多边形,给出N-1空三角形,因此总共为?(N²).已经证明这个界限很紧[平面点集与少量空凸多边形,I.Bárány和P. Valtr].

在形成凸多边形的点的情况下,所有三角形都是空的O(N³).快速算法的机会越来越低:(

algorithm computational-geometry

9
推荐指数
1
解决办法
655
查看次数

如何有效地将整数转换为Fibonacci编码?

通过从0和1开始然后添加最后两个数字以获得下一个数来获得斐波那契序列.

在此输入图像描述

所有正整数都可以表示为一组Fibonacci数的总和而不重复.例如:13可以是集合{13},{5,8}或{2,3,8}的总和.但是,正如我们所看到的,一些数字有多个集合,其总和是数字.如果我们添加约束集不能有两个连续的Fibonacci数,那么我们每个数都有一个唯一的表示.

我们将使用二进制序列(只有零和1)来做到这一点.例如,17 = 1 + 3 + 13.然后,17 = 100101.详细说明见图2.

在此输入图像描述

我想将一些整数转换为这种表示,但整数可能非常大.如何有效地做到这一点.

algorithm math

7
推荐指数
1
解决办法
1193
查看次数

Java中的双重比较技巧

C++允许您将两个整数比较组合在一起进行范围检查,例如

(unsigned)X < (unsigned)Upper
Run Code Online (Sandbox Code Playgroud)

当返回时返回true

0 <= X < Upper
Run Code Online (Sandbox Code Playgroud)

Java语言没有无符号类型.您是否看到了一种获得相同效果的方法,使用单一比较而不是太多开销?

更新:

从@Bathsheba的评论来看,char类型是无符号的16位并且适合我的目的,因为我的整数实际上在短裤的范围内.

问题仍然存在问题int.

可能是某些东西(X | (Upper - 1 - X)) >= 0,允许30位的范围.

java comparison

7
推荐指数
1
解决办法
197
查看次数

合并重叠的轴对齐矩形

我有一组轴对齐的矩形.当两个矩形重叠(部分或完全)时,它们将合并到它们的公共边界框中.此过程以递归方式工作.

检测所有的重叠和使用工会发现,形成组,您合并,最终将无法工作,因为两个矩形的合并覆盖更大面积,可以创造新的重叠.(在下图中,合并了两个重叠的矩形后,会出现新的重叠.)

在此输入图像描述

在我的情况下,矩形的数量是中等的(比如N <100),可以使用强力解决方案(尝试所有对,如果发现重叠,则从头开始合并并重新启动).无论如何,我想降低复杂性,在最坏的情况下可能是O(N³).

有什么建议如何改善这个?

algorithm rectangles computational-geometry

7
推荐指数
1
解决办法
568
查看次数

使字符串在.NET应用程序中持久存在

我试图在VS 2008下用C ++编写的.NET应用程序中使字符串持久化(即,它是文件路径)。我只需要在应用程序启动时阅读它,并在离开时编写它即可。

我正在努力寻找适当的方法来做到这一点。Web搜索将我定向到ConfigurationSettings和ConfigurationManager对象。似乎第一个是只读的,而第二个在配置参考(框架3.5)中找不到。

我知道我可以对注册表或外部文件执行显式的读/写操作,但我希望使用更标准的方法。我不希望这需要两行以上的代码。

我在正确的轨道上吗?

.net persistence visual-studio

7
推荐指数
1
解决办法
161
查看次数

GDI的数值精度限制?

我正在使用Windows GDI函数Arc绘制圆弧.它需要参数圆的边界框和两个分界开始和结束角度的点(不是角度本身).

当我传递如下的参数时,我得到一个异常结果.而不是具有大半径的圆的准平圆弧(大约13069,边界框是正方形),我得到图片上的输出(旋转;第二个版本显示两个端点的位置;第三个是预期的输出).

Arc(hDC, -25660, -12837, 477, 13300, 475, 462, 476, 66);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我怀疑异常是由于弧的大半径/平坦度,尽管坐标不是那么大.你有什么解释吗?我主要关注的是找到出现这些显着特征的条件,以便解决这些问题.


这是一个产生问题的简单控制台应用程序:

#include <Windows.h>

int main(int argc, char* argv[])
{
    HDC hDC= GetDC(GetForegroundWindow());
    SelectObject(hDC, GetStockObject(WHITE_PEN));

    // Right
    Arc(hDC, -16, 37, 457, 510, 475, 462, 476, 66);

    // Wrong
    Arc(hDC, -25660, -12837, 477, 13300, 475, 462, 476, 66);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

windows precision gdi

6
推荐指数
0
解决办法
136
查看次数