假设我有两个向量:
std::vector<int> numbers;
std::vector<std::string> words;
我读了两个文件:一个只有数字,另一个有单词。我想用数字作为我的单词的密码,因此numbers
XOR
words
将是ciphertext
,ciphertext
XOR
numbers
将还给我words
。
我正在尝试做一些类似的事情
int charCount = wordsCount >= numbersCount ? numbersCount : wordsCount;
for (int i = 0; i < charCount; i++) {
result[i] = words[i] ^ numbers[i];
}
但这不起作用
no match for 'operator^' (operand types are '__gnu_cxx::__alloc_traits<std::allocator<std::__cxx11::basic_string<char> >, std::__cxx11::basic_string<char> >::value_type' {aka 'std::__cxx11::basic_string<char>'} and '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type' {aka 'int'})|
我怎样才能用最简单的方法呢?
UPD:所以我真正想要的是把单词中的每个字符和下面的数字异或。
如果您想用相应的数字对一个单词的所有字符进行异或运算,您需要对每个字符进行迭代。没有办法用operator^
对字符串的所有字符进行异或运算。
你可以做这个
std::transform(std::begin(numbers),
std::begin(numbers) + std::min(numbers.size(), words.size()),
std::begin(words),
std::begin(words),
[](auto number, auto word)
{
std::transform(std::begin(word), std::end(word),
std::begin(word),
[number](auto c)
{ return c ^ number; });
return word;
});
它是对称的,因此可以用于编码和解码。
我很少建议这样做,但在这种情况下,传统的for循环可能更可读:
int min = std::min(numbers.size(), words.size());
for (int i = 0; i < min; ++i)
for (int j = 0; j < words[i].size(); ++j)
words[i][j] = words[i][j] ^ numbers[i];