c# - 如何将 C# 中的 Lambda 表达式转换为 C++

标签 c# c++ function lambda

我正在研究 MinHash 函数。我刚刚在 C# 中找到了一些代码,但我想用 C++ 编写,因为我现有的代码是用 C++ 编写的。

我对 lambda 表达式和委托(delegate)函数很困惑。

C#代码就像

public delegate uint Hash(int toHash);
private Hash[] hashFunctions;

// Public access to hash functions
public Hash[] HashFunctions
{
    get { return hashFunctions; }
}

// Generates the Universal Random Hash functions
// http://en.wikipedia.org/wiki/Universal_hashing
private void GenerateHashFunctions(int u)
{
    hashFunctions = new Hash[numHashFunctions];

    // will get the same hash functions each time since the same random number seed is used
    Random r = new Random(10);
    for (int i = 0; i < numHashFunctions; i++)
    {
        uint a = 0;
        // parameter a is an odd positive
        while (a % 1 == 1 || a <= 0)
            a = (uint)r.Next();
        uint b = 0;
        int maxb = 1 << u;
        // parameter b must be greater than zero and less than universe size
        while (b <= 0)
            b = (uint)r.Next(maxb);
        hashFunctions[i] = x => QHash(x, a, b, u);
    }
}
// Universal hash function with two parameters a and b, and universe size in bits
private static uint QHash(int x, uint a, uint b, int u)
{
    return (a * (uint)x + b) >> (32 - u);
}

我已经尝试通过 create struct 将其转换为 C++,但我仍然不知道如何处理这一行

hashFunctions[i] = x => QHash(x, a, b, u);

我现在得到的C++代码

 struct Hash
    {
    // Universal hash function with two parameters a and b, and universe size in   bits
    unsigned int operator()(int toHash)      
        {     

    }
};


    Hash* hashFunctions;

    void GenerateHashFunctions(int u)
        {
            hashFunctions = new Hash[numHashFunction];

            // will get the same hash functions each time since the same random number seed is used
                for (int i = 0; i < numHashFunction; i++)
            {
                    unsigned int a = 0;
                    // parameter a is an odd positive
                    while (a % 1 == 1 || a <= 0)
                        a = (unsigned int)rand()%10;
                    unsigned int b = 0;
                    int maxb = 1 << u;
                    // parameter b must be greater than zero and less than universe size
                    while (b <= 0)
                        b = (unsigned int)rand()%maxb;;

            //hashFunctions[i] = x => QHash(x, a, b, u);
            }
    }

    static unsigned QHash(int x,unsigned int a,unsigned int b,int u) 
    {
        return (a * (unsigned int)x + b) >> (32 - u);
    }

有人给我一些建议吗?非常感谢

最佳答案

使用 C++ lambda 表达式。

hashFunctions[i] = [=] (auto x) { return QHash(x, a, b, u); };

另外请避免使用原始指针或数组。 使用标准容器,例如

std::vector<std::function<uint (int)>>

此外,你不应该使用 c 风格的转换,例如

(unsigned)(expression)

喜欢

static_cast<unsigned>(expression)

编辑:这是一个例子:

#include <vector>
#include <functional>

....

private:
using HashProvider = std::function<uint, (int)>;
auto GenerateHashFunctions(int u)
{
     auto hashFunctions = std::vector<HashProvider>(numHashFunctions);
     for (int i = 0; i < numHashFunctions; i++)
     {
        uint a = 0;
        // parameter a is an odd positive
        while (a % 1 == 1 || a <= 0) {
            a = static_cast<uint>(r.Next());
        }
        uint b = 0;
        int maxb = 1 << u;
        // parameter b must be greater than zero and less than universe size
        while (b <= 0) {
            b = static_cast<uint>(r.Next(maxb));
        }
        hashFunctions.push_back([=](auto x) { return QHash(x, a, b, u); });

   }
   return hashFunctions;
}

关于c# - 如何将 C# 中的 Lambda 表达式转换为 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33887145/

相关文章:

c# - Oracle Coherence 是否支持批量删除操作?

c++ - 在 cgo 库中链接第 3 方静态库

c++ - 通过文本文件将字符串和 Int 发送到函数

c++ - 使用指针变量打印特定的数组变量

c# - 如何将 GridView RowHeaderColumn 设置为 TemplateField?

c# - 为什么我无法从其他程序集中加载类?

c++ - 内存对齐和长拷贝

c++ - 结构的大小如何随不同的数据类型而变化

javascript - 函数之间传递值

c# - Http 请求在从 ServiceBase.OnShutdown 发送时中止,但在 OnStop 中未中止