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)
您的给定成员函数有一个隐藏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)
| 归档时间: |
|
| 查看次数: |
1890 次 |
| 最近记录: |