Каким образом заменить функцию .find() языка python в языке c++

Всем привет! Появилась задача переписать небольшой код с языка python на c++ (суть задачи: шифрование сообщения многоалфавитной одноконтурной подстановкой) и возникла проблема замены функции .find() в Пайтон на что либо другое в плюсах. Пытался и через цикл и через функцию find в с++ - не выходит. Если сможете помочь - буду очень благодарен!

Код на Python:

alphabet_two = "ABCDEFGHIJKLMNOPQRSTUVWXYZ[]{}$#@+=_*&^%,-abcdefghijklmnopqr|/tuvwxyz:!?."
alphabet_three = "АБВГДЕЁЖЗИЙКЛМНОПРСТУ ,абвгдеёжзий-клмнопрстуфхцчшщъыьэюя;ФХЦЧШЩ|/ЪЫЬЭЮЯ."
alphabet_four = "STUVWXYZ[]{}$#@+=_*&^%,abcdABCDEFGHIJKLMNOPQRefghijk-lmnopqrst|/uvwxyz:!?"

def crypt (message, alphabet_one, alphabet_two, alphabet_three, alphabet_four):
    result = ''
    for i in range(0, len(message), 3):
        index = alphabet_one.find(message[i])
        result += alphabet_two[index]
        if i + 1 < len(message):
            index = alphabet_one.find(message[i + 1])
            result += alphabet_three[index]
        if i + 2 < len(message):
            index = alphabet_one.find(message[i + 2])
            result += alphabet_four[index]
    return result

def decrypt(message, alphabet_one, alphabet_two, alphabet_three, alphabet_four):
    result = ''
    for i in range (0, len(message), 3):
        index = alphabet_two.find(message[i])
        result += alphabet_one[index]
        if i + 1<len(message):
            index = alphabet_three.find(message[i+1])
            result += alphabet_one[index]
        if i + 2 < len(message):
            index = alphabet_four.find(message[i+2])
            result += alphabet_one[index]
    return result

Мои попытки на плюсах:

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

string alphabet_one = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ ,абвгдеёжзийклмнопрстуфхцчшщъыь!?эюя;.-";
string alphabet_two = "ABCDEFGHIJKLMNOPQRSTUVWXYZ[]{}$#@+=_*&^%,-abcdefghijklmnopqr|/tuvwxyz:!?.";
string alphabet_three = "АБВГДЕЁЖЗИЙКЛМНОПРСТУ ,абвгдеёжзий-клмнопрстуфхцчшщъыьэюя;ФХЦЧШЩ|/ЪЫЬЭЮЯ.";
string alphabet_four = "STUVWXYZ[]{}$#@+=_*&^%,abcdABCDEFGHIJKLMNOPQRefghijk-lmnopqrst|/uvwxyz:!?";

string crypt (string message, string alphabet_one, string alphabet_two, string alphabet_three, string alphabet_four)
{
    string result = "";
    for (int i = 0; i < message.length() - 1; i += 3)
    {
        int index = 0;
        for (int y = 0; y < alphabet_one.length(); y++)
        {
            if (alphabet_one[y] != message[y])
            {
                index++;
            }
            else
            {
                break;
            }
        }
        result += alphabet_two[index];
        if (i + 1 < message.length())
        {
            for (int t = 0; t < alphabet_one.length(); t++)
            {
                if (alphabet_one[t] != message[t + 1])
                {
                    index++;
                }
                else
                {
                    break;
                }
            }
            result += alphabet_three[index];
        }
        if (i + 2 < message.length())
        {
            for (int r = 0; r < alphabet_one.length(); r++)
            {
                if (alphabet_one[r] != message[r + 2])
                {
                    index++;
                }
                else
                {
                    break;
                }
            }
            result += alphabet_four[index];
        }
        }
        return result;
}
int main()
{
    string message;
    cin >> message;
    cout << crypt(message,alphabet_one,alphabet_two,alphabet_three,alphabet_four) << endl;
}

Ответы (2 шт):

Автор решения: nyekitka

У класса std::string есть точно такой же метод find() (с некоторыми исключениями). Если передать туда символ, то он вернёт индекс первого вхождения в строке этого символа, либо -1, если такого символа нет. Подробнее можете прочитать здесь

→ Ссылка
Автор решения: DmitryK

У вас проблема в том, что вы используете std::string для русских букв. Надо использовать std::wstring, иначе поиск работать с русскими буквами не будет. Перепишите код в лоб с использованием wstring. Ну и в функцию передавайте константные ссылки, чтобы не было копирования больших строк.
Вот так работает:

wstring alphabet_one = L"АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ ,абвгдеёжзийклмнопрстуфхцчшщъыь!?эюя;.-";
wstring alphabet_two = L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[]{}$#@+=_*&^%,-abcdefghijklmnopqr|/tuvwxyz:!?.";
wstring alphabet_three = L"АБВГДЕЁЖЗИЙКЛМНОПРСТУ ,абвгдеёжзий-клмнопрстуфхцчшщъыьэюя;ФХЦЧШЩ|/ЪЫЬЭЮЯ.";
wstring alphabet_four = L"STUVWXYZ[]{}$#@+=_*&^%,abcdABCDEFGHIJKLMNOPQRefghijk-lmnopqrst|/uvwxyz:!?";

wstring crypt ( const wstring& message, 
                const wstring& alphabet_one, 
                const wstring& alphabet_two, 
                const wstring& alphabet_three, 
                const wstring& alphabet_four)
{
    wstring result;
    for (int i = 0; i < message.length(); i += 3)
    {
        int index = alphabet_one.find(message[i]);
        result += alphabet_two[index];
// ну и так далее
}
int main()
{
    ios_base::sync_with_stdio(false);
    wcin.imbue(locale("en_US.UTF-8"));
    wcout.imbue(locale("en_US.UTF-8"));

    wstring message = L"привет";
    //wcin >> message;
    wcout << crypt( message, alphabet_one, alphabet_two, alphabet_three, alphabet_four) << endl;
}

И не забывайте, что входная строка должна обязательно состоять из символов, имеющихся в wstring alphabet_one. Иначе функция wstring::find() вернет npos, т.е. -1, и вы получите ошибку по обращению к массиву (строке) с отрицательным индексом. В коде питона эта неопределенность тоже присутствует.

→ Ссылка