在C++字符串上使用std转换

Bru*_*lon 0 c++ string algorithm transform c++11

我试图用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);
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我错误在哪里?另外,为了使用for_each,我需要修改什么?我相信它会涉及将返回值更改为void并将结果存储在letter中.

感谢,并有一个愉快的一天

编辑:尝试添加绑定,但仍然无法正常工作.目前的电话是:

std::transform(data_.begin(), data_.end(), data_.begin(), bind(&UndoCaesar, this, std::placeholders::_1));
Run Code Online (Sandbox Code Playgroud)

chr*_*ris 8

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

std::transform(data_.begin(), data_.end(), data_.begin(), 
    std::bind(&CryptoModule::UndoCaesar, this, std::placeholders::_1)
);
Run Code Online (Sandbox Code Playgroud)

注意std::bind是在<functional>.这一切都基本上会std::transform调用任何函数状物体,f,它需要像f(currentElement),并有依次调用UndoCaesar(this, currentElement)this作为其状态的一部分,因为你的约束它.

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

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

  • @BrunoAyllon,这是一个成员函数.成员函数需要一个对象来操作.你能否更具体地说明你的错误?这是一个[工作示例](http://coliru.stacked-crooked.com/a/2ee773ba03163499). (2认同)