Предлагает ли c ++ 11 аналогичное решение, реализованное в python maketrans / translate?

Предлагает ли C ++ 11 элегантное решение, реализованное в Python? maketrans / перевод?

from string import maketrans

intab = "aeiou"outtab = "12345"trantab = maketrans(intab, outtab)

str = "this is string example....wow!!!";
print str.translate(trantab);

0

Решение

Насколько я знаю, для этого нет встроенной функции, но вы могли бы реализовать ее:

#include <functional>
#include <string>
#include <unordered_map>

std::function<std::string(std::string)>
maketrans(const std::string& from, const std::string& to) {
std::unordered_map<char, char> map;
for (std::string::size_type i = 0;
i != std::min(from.size(), to.size()); ++i) {
map[from[i]] = to[i];
}
return [=](std::string s) {
for (auto& c : s) {
const auto mapped_c = map.find(c);
if (mapped_c != map.end()) {
c = mapped_c->second;
}
}
return s;
};
}

#include <iostream>
int main() {
const std::string intab = "aeiou";
const std::string outtab = "12345";
const auto translate = maketrans(intab, outtab);

const std::string str = "this is string example....wow!!!";
std::cout << translate(str) << std::endl;
return 0;
}
5

Другие решения

Моя попытка Нужно было бы сделать помощника для создания карты из двух строк:

#include <iostream>
#include <string>
#include <map>
using namespace std;

using TransMap = std::map<char, char>;
void translate(std::string& string, TransMap map ){
for(auto& c : string){
const auto itr = map.find(c);
if(itr != map.end()) c = itr->second;
}
}

int main() {
std::string test = "123456789";
TransMap map{ {'1', 'a'}, {'2', 'b'}, {'3', 'c'}, {'4', 'd'}, {'5', 'e'} };
translate(test, map);
std::cout << test << '\n';
return 0;
}
1

По вопросам рекламы [email protected]