小编Oop*_*ser的帖子

创建匿名类型的通用列表有诀窍吗?

有时我需要使用一个元组,例如我有坦克和他们的目标坦克列表(他们追逐他们或类似的东西):

List<Tuple<Tank,Tank>> mylist = new List<Tuple<Tank,Tank>>();
Run Code Online (Sandbox Code Playgroud)

然后当我遍历列表时,我访问它们

mylist[i].item1 ...
mylist[i].item2 ...
Run Code Online (Sandbox Code Playgroud)

这是非常令人困惑的,我总是忘记什么是item1和什么是item2,如果我可以通过以下方式访问它们:

mylist[i].AttackingTank...
mylist[i].TargetTank...
Run Code Online (Sandbox Code Playgroud)

它会更清楚,有没有办法在没有定义类的情况下完成它:

MyTuple
{
public Tank AttackingTank;
public Tank TargetTank;
}
Run Code Online (Sandbox Code Playgroud)

我想避免定义这个类,因为那时我将不得不在不同的场景中定义许多不同的类,我可以做一些"技巧"并使这个匿名.

就像是 :

var k = new {Name = "me", phone = 123};
mylist.Add(k);
Run Code Online (Sandbox Code Playgroud)

当然,我定义它时没有类型传递给List的问题

c# generics anonymous-types

37
推荐指数
5
解决办法
4万
查看次数

如何快速解析C++中以空格分隔的浮点数?

我有一个包含数百万行的文件,每行有3个以空格分隔的浮点数.读取文件需要花费大量时间,因此我尝试使用内存映射文件读取它们,但发现问题不在于IO的速度,而在于解析速度.

我当前的解析是获取流(称为文件)并执行以下操作

float x,y,z;
file >> x >> y >> z;
Run Code Online (Sandbox Code Playgroud)

Stack Overflow中的某些人建议使用Boost.Spirit,但我找不到任何简单的教程来解释如何使用它.

我正在尝试找到一种简单有效的方法来解析看起来像这样的行:

"134.32 3545.87 3425"
Run Code Online (Sandbox Code Playgroud)

我真的很感激一些帮助.我想用strtok来分割它,但我不知道如何将字符串转换为浮点数,我不太确定它是最好的方法.

我不介意解决方案是否会提升.我不介意它是不是有史以来最有效的解决方案,但我确信它可以加倍速度.

提前致谢.

c++ parsing boost-spirit

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

CUDA核心和CPU核心有什么区别?

我在CUDA上工作了很多,并且在CPU上做了很多工作,我正在努力理解两者之间的区别.我的I5处理器有4个内核,售价200美元,我的NVidia 660有960个内核,成本差不多.

如果有人能够解释两种处理单元架构在能力优劣方面的主要区别,我会非常高兴.例如,CUDA核心是否有分支预测?

cpu cuda

24
推荐指数
2
解决办法
2万
查看次数

为什么std :: map是红黑树而不是哈希表?

这对我来说很奇怪,我希望它是一个哈希表.

我在下面的答案中看到了3个理由(这可能是正确的,但我不认为它们是真正的原因). 哈希表v自我平衡搜索树

  1. 虽然哈希可能不是一个简单的操作.我认为对于大多数类型来说它非常简单.

  2. 当你使用map时,你会期望能够分期付款的东西O(1)insert,delete,find,not log(n).

  3. 我同意树木的最坏情况表现更好.

我认为有更大的理由,但我无法弄明白.在c#中,例如Dictionary是一个哈希表.

c++ std

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

使用lambda表达式时,c#中的闭包是如何工作的?

在以下教程中:http://www.albahari.com/threading/

他们说以下代码:

for (int i = 0; i < 10; i++)
  new Thread (() => Console.Write (i)).Start();
Run Code Online (Sandbox Code Playgroud)

是非确定性的,可以产生以下答案:

0223557799

我认为当使用lambda表达式时,编译器会创建某种匿名类,通过在捕获类中创建类似它们的成员来捕获正在使用的变量.但是i值类型,所以我认为他应该被价值复制.

我的错在哪里?

如果答案将解释闭包如何工作,如何保存特定int的"指针",在这种特定情况下生成了什么代码,那将非常有用?

c# lambda

11
推荐指数
1
解决办法
917
查看次数

谁在+运算符中删除了复制的实例?(C++)

我搜索了如何在互联网上正确实现+运算符,我找到的所有结果都执行以下步骤:

const MyClass MyClass::operator+(const MyClass &other) const
{
    MyClass result = *this;  // Make a copy of myself. Same as MyClass result(*this);
    result += other;         // Use += to add other to the copy.
    return result;           // All done!
}
Run Code Online (Sandbox Code Playgroud)

关于这个"过程"我几乎没有问题:

  1. 以这种方式实现+运算符不是那么愚蠢,它在第一行调用赋值运算符(复制类),然后在返回中调用复制构造函数(由于返回的事实,它也复制了类)按价值,所以它破坏了第一个副本并创建了一个新的......坦白说,这并不是很聪明......)

  2. 当我写a = b + c时,b + c部分创建该类的新副本,然后'a ='部分将副本复制给自己.谁删除了b + c创建的副本?

  3. 有没有更好的方法来实现+运算符而不需要两次处理类,也没有任何内存问题?

提前致谢

c++ memory copy variable-assignment operator-keyword

9
推荐指数
2
解决办法
284
查看次数

如何在c#中正确使用SortedDictionary?

我想做一些非常简单的事情,但似乎我不明白SortedDictionary.

我要做的是以下内容:
创建一个排序字典,按一些浮点数对我的项目进行排序,因此我创建了一个类似于此的字典

SortedDictionary<float, Node<T>> allNodes = new SortedDictionary<float, Node<T>>();
Run Code Online (Sandbox Code Playgroud)

现在我添加项目后,我想逐个删除它们(每次删除都应该从最小到最大的复杂度为O(log(n)).

我该怎么做?我认为这只allNodes[0]会给我最小的,但事实并非如此.

更重要的是,似乎字典无法处理重复的键.我觉得我使用的是错误的数据结构......
如果我有一堆节点需要按照它们的距离(浮点)进行排序,我应该使用其他东西吗?

c# dictionary sorted sorteddictionary

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

是否可以使用C++中的宏创建像C#中的"扩展方法"?

我想扩展std :: string并添加"equals".所以我做了以下事情:

#define Equals(str1) compare(str1) == 0
Run Code Online (Sandbox Code Playgroud)

并使用以下代码:

if ( str.Equals("hhhhllll") )
Run Code Online (Sandbox Code Playgroud)

其中(我假设)编译

if ( str.compare("hhhhllll") == 0 )
Run Code Online (Sandbox Code Playgroud)

一切都很好.

现在我想改进我的宏,添加括号来编译

if ( (str.compare("hhhhllll") == 0) ) 
Run Code Online (Sandbox Code Playgroud)

我尝试过类似的东西:

    #define (str).Equals(str1) (str.compare(str1) == 0)
Run Code Online (Sandbox Code Playgroud)

但它不会编译(宏根本不适合)

我怎样才能实现它?

c++

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

何时返回值的复制构造函数发生

我有以下成员函数:

Person ClassB::DoSomethingAndReturnPerson()
{
 RAIIMutex myLock(&m_mutex);
 return m_person;
}
Run Code Online (Sandbox Code Playgroud)

RAIIMutex 是一个辅助类,它接收互斥锁并将其锁定在构造函数中并在析构函数中释放.

m_person是类型Person(尺寸非常小).其他线程中的其他函数可能会更改此成员.

我希望m_person按值返回(返回副本),当然我想避免m_person在返回时复制另一个线程时被更改的情况,所以我添加了锁.

但首先会发生什么?编译器是先创建一个m_person或者先调用析构函数的副本myLock吗?

从理论上讲,它可以通过这样的方式轻松解决:

Person ClassB::DoSomethingAndReturnPerson()
{
 RAIIMutex myLock(&m_mutex);
 Person tmp = m_person;
 return tmp;
}
Run Code Online (Sandbox Code Playgroud)

但我很想知道我的问题的答案.

谢谢

c++ return language-lawyer

8
推荐指数
1
解决办法
261
查看次数

如何计算炸弹爆炸面积?

我正在开发一款游戏,让我们说玩家在位置x = 100,y = 100并且爆炸半径为100个单位时放置炸弹......我很容易在游戏中找到所有"项目"被爆炸的炸弹击中(只需要检查他们与炸弹的距离是否低于100).

但现在我想考虑到我在游戏中遇到的障碍,障碍物是正方形,总是64*64像素,总是与轴对齐(不旋转)..我想知道一个项目是否"隐藏"背后知道他没被击中的障碍......

这样的事情:

在此输入图像描述

右边的家伙没有被击中,但是底部的家伙被打了,我把灰色打到了打击区域,绿色的区域被隐藏了......

我的想法是:1.找到的所有项目在现场看到,从炸弹的距离越低则100 2.找到场景中的所有障碍,从炸弹的距离越低则100.3.计算从线炸弹中心的物品..然后检查线是否与任何障碍物相交,如果没有......你被击中了.

最后,问题1.有没有人有更好的主意?2.有免费的开源c#兼容引擎可以帮助我吗?Box2d可以帮到我吗?

谢谢

math collision-detection game-physics computational-geometry

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