小编use*_*342的帖子

模板类的变量,模板类模板参数设置为带有变量的派生模板的基本模板

我正在尝试拥有一个派生类(普通模板),它具有一个模板类型的变量,该变量具有作为其模板类参数的派生类的基类类型(普通模板,与派生类相同的参数)(带变量的那个).这让VC++对我非常生气,我无法平息它的愤怒.这是一个简单的例子:

template<template<typename VT> class CT, typename VT> struct encapThing {};

template<typename VT> struct innocuousBase {};

template<typename VT> struct derivOfDoom : public innocuousBase<VT>
{
    encapThing<innocuousBase, VT> ohgodhelp; //C3200
};
Run Code Online (Sandbox Code Playgroud)

它将抛出一个C3200,说它期望一个类模板.现在,我可以看到为什么这可能会认为模板中存在模板的递归循环,即使实际情况并非如此.我怎么能说服VC++呢?

c++ templates

13
推荐指数
1
解决办法
181
查看次数

确定是否可以使用单个三角形扇形绘制2d多边形

起初,我认为这个问题等同于确定多边形是否是凸面,但似乎仍然可以通过一个三角形扇形绘制非凸多边形. 考虑这个形状,一个非凸多边形.可以很容易地想象一些中心点区域允许用三角形扇形绘制这个多边形(尽管会有其他中心点不会).给定一个固定的中心点,我希望能够确定定义多边形的2d点的集合是否允许使用单个三角形扇形绘制它.

看起来关键是要确保从中心点到任何顶点绘制的线条没有"妨碍",这意味着顶点的其他边缘线.但是,重要的是尽可能使计算成本低廉,并且我不确定这样做是否有一个很好的数学捷径.

最终,我将要让多边形的顶点移动,并且我需要确定允许顶点移动的"边界",因为其余的是固定的(并且可能稍后甚至允许直接同时反应移动)还有2个邻居),以保持多边形能够在单个三角形扇形中绘制.但这就是未来,希望对整个多边形的测试可以分解为一个计算子集,以假设已经凸出的多边形来测试单个顶点运动的边界.

c++ math geometry computational-geometry

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

MySql语句准备"不坚持"

我正在尝试使用预准备语句,而MySqlCommand执行得很好,执行时间非常糟糕.我让它将cmd.IsPrepared的结果写入控制台,果然,它是假的.这是我设置MySqlCommand的地方:

MySqlCommand cmd = con.CreateCommand();
cmd.CommandText = @"INSERT INTO dict (pre, dist, dict.char, score) VALUES(@pre, @dist, @char, @score) ON DUPLICATE KEY UPDATE score = score + @score";
cmd.Parameters.Add("@pre", MySqlDbType.VarChar, 32);
cmd.Parameters.Add("@dist", MySqlDbType.Int32);
cmd.Parameters.Add("@char", MySqlDbType.VarChar, 1);
cmd.Parameters.Add("@score", MySqlDbType.Double);
cmd.Prepare();
Run Code Online (Sandbox Code Playgroud)

在添加具有相同结果的参数之前,我还尝试执行Prepare().

然后,我有一个代码循环,它执行一些计算并设置变量,如下所示:

cmd.Parameters[3].Value = score;
Run Code Online (Sandbox Code Playgroud)

...在运行时间之前,对命令不做任何其他操作:

Console.WriteLine(cmd.IsPrepared);
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

控制台的结果总是错误的.这一切都是在一个基本的交易中完成的,但这似乎不应该搞砸了.不过,我在设置MySqlCommand之前会打开事务.

关于这出错的任何想法?

编辑:我在java中复制了代码,准备好的语句可以正常工作.所以这不是我的数据库服务器本身的问题,它特别是.net中的一个问题.当然,.net /连接器并没有为每个人打破,所以这可能是什么交易?

并且它肯定没有准备好,根本就没有设置bool值,.net对于某些测试输入的运行时间太长了我没有耐心等待它,但在java中相同的输入运行在~3分钟.两者使用基本相同的代码.

这是我在.net中做的一个简单的测试,所以你可以看到我正在尝试的完整代码(我从连接字符串中删除了UID和密码,但是在正常的代码中,它们就在那里,建立了连接,并且语句将数据输入数据库):

        using (MySqlConnection con = new MySqlConnection(@"SERVER=localhost;DATABASE=rb;UID=;PASSWORD=;"))
        {
            con.Open();

            using (MySqlCommand cmd = con.CreateCommand())
            {
                cmd.CommandText = @"INSERT INTO test (test.test) VALUES(?asdf)";
                cmd.Prepare(); //doesn't work

                cmd.Parameters.AddWithValue("?asdf", 1);

                cmd.ExecuteNonQuery();
            } …
Run Code Online (Sandbox Code Playgroud)

c# mysql

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

来自O(1)中unordered_set的随机元素

我见过人们提到可以在O(1)时间内从unordered_set中获取随机元素.我试图这样做:

std::unordered_set<TestObject*> test_set;

//fill with data

size_t index = rand() % test_set.size();
const TestObject* test = *(test_set.begin() + index);
Run Code Online (Sandbox Code Playgroud)

但是,unordered_set迭代器不支持带整数的+. begin可以给出一个size_t参数,但它是一个桶而不是一个元素的索引.随机挑选一个桶然后在其中随机挑选一个元素将导致非常不平衡的随机分布.

适当的O(1)随机访问的秘诀是什么?如果重要,这是在VC++ 2010中.

c++ stl unordered-set

10
推荐指数
3
解决办法
5193
查看次数

在特征中设置顶点着色器的投影,模型和视图变换

我环顾四周,从未见过,确定过,确切地知道每个矩阵的作用以及形成它们的操作(因此实际的特征函数调用).这就是我要找的东西.或至少对过程的描述和具有特征函数的几个例子一般来看一下如何做到这一点!无论如何,这里有一些细节,以防它们有用:

我正在设置一个自上而下的透视游戏(所以相机固定向下,但可以旋转并沿XY平面移动),但是因为我会有一些3D元素(以及一些严格的2D)我认为透视投影效果很好.但我确实想知道形成正交投影需要什么命令......

我理解视图,这可以通过将相机坐标转换到原点,通过相机旋转旋转,将它们转换回原来的位置来完成,然后缩放以进行缩放?但确切地说,涉及哪些功能和对象,我不确定.

并且为了存储任何给定对象的旋转,四元数似乎是最佳选择.那么这将决定模型投影吗?如果我设法将我的旋转简化为一个角度的2D情况,那么四元数会不会浪费?

这些矩阵是否需要从每个帧的身份重新生成?或者他们可以以某种方式改变以适应新数据?

我真的更喜欢使用eigen而不是手持库,但我需要一些工作来弄清楚到底发生了什么...我有所有的GLSL设置和均匀的矩阵被送入渲染在我的VAO中,我只需要了解并制作它们.

编辑:
我的顶点着色器使用这个标准设置,3个统一的mat4s乘以位置vec3:

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_Position, 1.0);
Run Code Online (Sandbox Code Playgroud)

可以将mat3s和vec2用于位置,以在纯2D情况下获得更好的性能吗?

c++ opengl game-engine eigen

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

如何处理多个同时发生的弹性碰撞?

我是通过使用维基百科上的基本方程碰撞成对的2D凸对象(无旋转)来计算结果的.但是,当存在依赖关系时,例如两个对象同时命中另一个对象:

在此输入图像描述

例如,在这里,对象1和2在完全相同的时间击中3,成对方法失败.根据我计算碰撞的顺序(先是1-3或先2-3),我会得到不同的结果.通过碰撞的重复迭代仍将给出依赖于顺序的结果.

我已经设置了它,所以我可以弄清楚哪些对象彼此接触,所以我的代码会知道在计算其中一对时,对象3在那一刻与另一个对象发生碰撞(所以1-3碰撞会知道关于2-3碰撞,反之亦然).我也知道边缘/角落与什么接触.

无论什么解决方案都需要健壮...例如,如果设置变得更复杂,就像这两个例子:

在此输入图像描述

这个过程需要能够处理这个问题,甚至更糟.任何可能的同时接触/碰撞链.我将手头上的所有数据描述它们,所以我"只"需要知道如何解决这些系统的一般情况.我目前没有对旋转做任何事情,这简化了事情.

看起来它可能涉及将对象分组在一起,但是由非正交的边缘引起的干扰(参见最后一个带有六边形的示例)似乎会使该方法失败.

我之前看过一个类似的问题,但答案从未被检查过(死胡同?).我不确定冲击传播会如何解决我的第一个例子,因为C在第一次碰撞后就会移开......所以有什么震撼可以传播?编辑:好的,我现在看到同时碰撞和震动传播是两个不同的想法,这就是为什么它看起来没用.

language-agnostic algorithm physics game-physics physics-engine

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

Lambda函数无法调用函数模板参数的静态函数

好的,所以我有一些基本上像这样的设置:

template<typename T> void example()
{
 std::function<int (byte*)> test = [=](byte* start) -> int
 {
  return T::magic(start);
 }
}
Run Code Online (Sandbox Code Playgroud)

忽略这些裸体调用的"不洁"程度,它也不会编译,给出这些错误:

'T' : is not a class or namespace name
'magic': identifier not found
Run Code Online (Sandbox Code Playgroud)

有没有办法能够在泛型类型名称T上进行调用,假设我将始终使用具有函数magic(byte*start)的类调用example()?当然,我不必为将要执行此操作的每个类重新声明此模板函数.

我在VC++ 2010中这样做,看起来它可能是编译器错误.任何可能的解决方法?

c++ lambda type-parameter c++11

6
推荐指数
1
解决办法
1658
查看次数

矢量化条件涉及短裤

我正在使用2个无符号短裤的紧凑结构,指示开始和结束位置.
我需要能够快速确定是否有任何Range长度(从开始到结束的差异)超过阈值的对象.

我将拥有大量的对象,每个对象都有自己的Range数组,因此Range在列表或其他内容中跟踪哪些对象高于阈值是不可行的.此代码也将经常运行(每个阵列每秒多次),因此它需要高效.

struct Range
{
 unsigned short start;
 unsigned short end;
}
Run Code Online (Sandbox Code Playgroud)

我将永远有一个Range大小为2 ^ n 的数组.虽然我想在找到超过阈值的东西时立即中止,但我很确定将它们全部放在一起然后检查结束会更快...假设我可以对循环进行矢量化.虽然如果我能在每个向量的结果块上做一个if语句,那就太棒了.

size_t rangecount = 1 << resolution;
Range* ranges = new Range[rangecount];

...

bool result = false;
for (size_t i = 0; i < ranges; ++i)
{
 result |= (range[i].end - range[i].start) > 4;
}
Run Code Online (Sandbox Code Playgroud)

毫不奇怪,自动矢量化器给出了1202错误,因为我的数据类型不是32位或64位宽.我真的不想将数据大小加倍并使每个字段成为无符号整数.所以我猜测自动矢量化方法就是为了这个.

是否有可以处理16位变量的向量指令?如果有,我如何在c ++中使用它们来矢量化我的循环?

c++ algorithm performance vectorization visual-c++

6
推荐指数
1
解决办法
116
查看次数

字符串中的模式的符号表示,并找到"相似的"子模式

字符串"abab"可以被认为是索引符号"0101"的模式.字符串"bcbc"也将由"0101"表示.这非常漂亮,可以进行强有力的比较,但它很快就会脱离完美的情况.

"babcbc"将是"010202".如果我想要注意它包含一个等于"0101"(bcbc部分)的模式,我只能考虑在每个索引处进行某种规范化处理,以便从符号上"重新表示"从n到长度的子字符串进行比较.如果我试图看看"babcbc"和"dababd"(010202 vs 012120)是否有任何共同之处,那就变得复杂了.效率低下!

如何有效地完成这项工作,处理所有可能的嵌套案例?请注意,我正在寻找类似的模式,而不是实际文本中的类似子字符串.

string algorithm pattern-matching data-structures

5
推荐指数
1
解决办法
352
查看次数

按顺序迭代,有序推送和删除的排序数据结构(仅从顶部开始的N个元素)

什么被认为是按顺序推送内容的最佳数据结构(因此插入任何位置,能够找到正确的位置),按顺序迭代,并从顶部弹出N个元素(因此N个最小元素,N通过与之比较确定门槛值)?推送和弹出需要特别快(在循环的每次迭代中运行),而数据的有序完全迭代以可变速率发生,但可能不太经常地减少一个数量级.完整迭代无法清除数据,需要保持不变.推送的所有内容最终都会被弹出,但由于pop可以删除多个元素,因此弹出比弹出更多.任何时候结构中的数据规模可以达到数百或数千个元素.

我目前正在使用std::deque二进制搜索以升序方式插入元素.分析显示它占据了大部分时间,因此必须改变一些东西. std::priority_queue不允许迭代,我看到做的黑客不会按顺序迭代.即使是在有限的测试中(没有完整的迭代!),该std::set课程表现比我的std::deque方法更差.

我正在搞乱的类似乎都没有考虑到这个用例.如果在STL中找不到数据结构或由于某种原因提升,我不反对自己创建类.

编辑:

现在有两个主要功能,pushprune. push使用率为65%,prune使用率为32%.使用的大部分时间push是由于插入deque(65%中的64%).只有1%来自二元搜索才能找到位置.

template<typename T, size_t Axes>
void Splitter<T, Axes>::SortedData::push(const Data& data) //65% of processing
{
 size_t index = find(data.values[(axis * 2) + 1]);

 this->data.insert(this->data.begin() + index, data); //64% of all processing happens here
}

template<typename T, size_t Axes>
void Splitter<T, Axes>::SortedData::prune(T value) //32% of processing
{
 auto top = data.begin(), end = data.end(), it = top;

 for …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm optimization stl data-structures

5
推荐指数
1
解决办法
1163
查看次数