почему я не могу заменить символ в такой строке? - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь заменить символы из следующей карты: const map<char, vector<char>> ass, обратите внимание, у меня есть эта строка pas, и я хочу заменить все векторные символы (значение карты) на соответствующий ключ карты, я попытался выполнить итерациюсопоставить с циклом for следующим образом: (я получил этот код из другого вопроса по stackoverflow)

for (auto const &ent1 : ass) {

    //ent1.first = first key
    //ent1.second = second key
}

Поэтому я попытался перебрать вектор значений карты следующим образом:

string char1;
string char2;
string wr;

for (auto const &ent1 : ass) {

    for (int i = 0; i < ent1.second.size(); i++) {

        specialValues += ent1.second[i];

        char2 = ent1.second[i];
        char1 = ent1.first;

        regex e("([" + char1 + "])");

        cout << ("([" + char1 + "])");
        cout << char2;

        wr = regex_replace("c1a0", e, char2);
    }

}

Я хочу, чтобы строка «c1a0» стала «ciao» после циклов, но она просто ничего не меняет,

Я также попробовал:

wr = regex_replace("c1a0", e, "o");

вывод: c1a0

regex e("([0])");
wr = regex_replace("c1a0", e, char2);

вывод: c1a2

Не знаю, для меня это не имеет смысла.Я не понимаю, можете ли вы помочь мне понять, что не так в моем коде?

Конечно, если я напишу:

regex e("([0])");
wr = regex_replace("c1a0", e, "o");

Это дает мне "c1ao", это то, что я хочу.

1 Ответ

0 голосов
/ 28 мая 2018

Следующий код работает для меня:

#include <string>
#include <map>
#include <regex>
#include <iostream>

using namespace std;

int main() {
    const map<char, vector<char>> ass = {
        { '1', {'i'} },
        { '0', {'o'} },
    };

    string char1;
    string char2;
    string wr = "c1a0";

    for (auto const &ent1 : ass) {

        for (int i = 0; i < ent1.second.size(); i++) {

            //specialValues += ent1.second[i];

            char2 = ent1.second[i];
            char1 = ent1.first;

            regex e("([" + char1 + "])");

            cout << ("([" + char1 + "])") << std::endl;
            cout << char2<< std::endl;

            wr = regex_replace(wr, e, char2);
            cout << wr << std::endl;

        }

    }
}

Но ИМХО, регулярное выражение здесь излишне.Вы можете перебрать строку вручную и заменить символ, как показано в следующем фрагменте:

#include <string>
#include <set>
#include <iostream>
#include <vector>

using namespace std;

struct replace_entry {
    char with;
    std::set<char> what;
};

int main() {
    const std::vector<replace_entry> replaceTable = {
        { 'i', {'1'} },
        { 'o', {'0'} },

    };

    string input = "c1a0";

    for (auto const &replaceItem : replaceTable) {
        for (char& c: input ) {
            if(replaceItem.what.end() != replaceItem.what.find(c)) {
                c = replaceItem.with;
            }
        }

    }
    cout << input << std::endl;
}

Еще один подход заключается в создании массива символов из 256 элементов

#include <string>
#include <iostream>

class ReplaceTable {
private:
    char replaceTable_[256];

public:
    constexpr ReplaceTable() noexcept 
        : replaceTable_()
    {
        replaceTable_['0'] = 'o';
        replaceTable_['1'] = 'i';
    }

    constexpr char operator[](char what) const noexcept {
        return replaceTable_[what];
    }

};

// One time initialization
ReplaceTable g_ReplaceTable;

int main() {

    std::string input = "c1a0";

    // Main loop
    for (char& c: input ) {
        if(0 != g_ReplaceTable[c] ) c = g_ReplaceTable[c];
    }

    std::cout << input << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...