【问题标题】:Using std transform on a C++ string在 C++ 字符串上使用 std 转换
【发布时间】:2014-03-24 19:14:54
【问题描述】:

我正在尝试通过使用 std::transform 来解密一个简单的凯撒密码来进行一些练习。但显然我的函数定义是错误的,因为编译器认为一元函数参数无效。这是我的代码:

char CryptoModule::UndoCaesar(char& letter)
{
    return (letter - atoi(key_.c_str()) % 128);
}

void CryptoModule::DecryptCaesar()
{
    std::transform(data_.begin(), data_.end(), data_.begin(), UndoCaesar);
}

谁能告诉我错误在哪里?此外,我需要修改什么才能使用 for_each ?我相信这将涉及将返回值更改为 void 并将结果存储在字母中。

谢谢,祝你有美好的一天

编辑:尝试添加绑定,但仍然无法正常工作。当前通话是:

std::transform(data_.begin(), data_.end(), data_.begin(), bind(&UndoCaesar, this, std::placeholders::_1));

【问题讨论】:

    标签: c++ string algorithm c++11 transform


    【解决方案1】:

    你给定的成员函数有一个隐藏的this 参数,所以你需要绑定它才能传递它:

    std::transform(data_.begin(), data_.end(), data_.begin(), 
        std::bind(&CryptoModule::UndoCaesar, this, std::placeholders::_1)
    );
    

    请注意,std::bind<functional> 中。所有这一切基本上是导致std::transform 调用任何类似函数的对象f,它需要像f(currentElement),然后又调用UndoCaesar(this, currentElement)this 是它的状态的一部分,因为你绑定了它。

    或者,您可以将调用包装在捕获 this 的 lambda 中,以便可以将其用于成员函数调用(隐式地,像往常一样):

    std::transform(data_.begin(), data_.end(), data_.begin(), 
        [this](char c) {return UndoCaesar(c);}
    );
    

    【讨论】:

    • 似乎仍然认为我缺少参数列表。对了,隐藏的这个参数是从哪里来的?
    • @BrunoAyllon,它是一个成员函数。成员函数需要一个对象来操作。你能更具体地说明你的错误吗?这是working example
    • 直接来自 Visual Studio :error C3867: 'CryptoModule::UndoCaesar': 函数调用缺少参数列表;使用 '&CryptoModule::UndoCaesar' 创建指向成员 c:\users\bruno\documents\mat258\encryption\encryption\cryptomodule.cpp 85 1 Encryption 的指针
    • @BrunoAyllon,您的代码前面有与号吗?它是成员函数指针所必需的,不像普通函数,当你有他们的名字时,它会衰减成函数指针。
    • 作为替代方案,我建议我们忘记 std::bind 存在并改用 lambda:std::transform(data_.begin(), data_.end(), data_.begin(), [this](char c) { return UndoCaesar(c); })
    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多