将一个字符串分别替换为其他 2 个字符串

Replacing a string with 2 other strings separatly

本文关键字:字符串 替换 其他 一个      更新时间:2023-10-16

我正在寻找将字符串中的字符替换为另一个字符串中的字符与另一个字符串相比。好吧,很难描述这一点,代码会更好:

std::string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
std::string keyboard = "AZERTYUIOPQSDFGHJKLMWXCVBNazertyuiopqsdfghjklmwxcvbn";
std::string change(std::string str)
{
    for (short i = 0; i < alphabet.length(); i++)
    {
        std::cout << str[i] << std::endl;
    }
    std::cout << str << std::endl;
    system("PAUSE");
    return str;
}

好吧,我认为这是不可以理解的,所以我试图做的是:

  1. 在str中查找(也许是Find()?)字母并获取字母表中的i变量。
  2. 使用 i 变量想要获取 pos,然后获取键盘字符串中的字母。

希望你明白我的意思,谢谢。

我虽然关于 replace()、find() 和 swap(),但没有工作,我可能做错了什么。提前谢谢你!

编辑:好吧,我确定你什么都不会明白,想象一下str ="你好",我想替换H每Y(字母= H ->键盘= I)?(字母表在字母字符串中得到H的位置,我们在i中记住这个位置,我们键盘[i]),这就是我想做的。

我建议

template <typename InputIterator,
          typename BidirIterator,
          typename ForwardIterator>
InputIterator substitute( InputIterator first, InputIterator last,
                          BidirIterator key_first, BidirIterator key_last,
                          ForwardIterator val_first )
{
    for (; first != last; ++first)
    {
        auto&& ref = *first;
        auto i = std::lower_bound( key_first, key_last, ref );
        if (i == key_last || *i != ref)
            return first;
        ref = *std::next(val_first, std::distance(key_first, i));
    }
    return last;
}

这假设[key_first, key_last)已排序,并且val_first引用的范围至少与 [key_first, key_last) 一样长。演示

这个想法是,我们使用类型待定的迭代器遍历范围的所有元素 - 即我们可以同时使用 char const[] s 和 std::vector<char> s。我们选择当前元素并使用二叉搜索在键集中查找该元素。然后,我们使用偏移量访问值集中的替换对应项,并将其分配给原始元素。

我们使用lower_bound进行二叉搜索。它本身并不构成一个,因此我们必须对返回值进行一些检查,以确保迭代器引用正确的值。如果我们找不到键,则返回第一个非工作元素的迭代器。(这可以是过去结束的迭代器。

avove 是一种适用于任意键/值集的通用方法:对于字母洗牌,有使用查找表的(依赖于平台的)方法。从乡村角度来看,这可能看起来像这样:

template <typename InputIterator>
void substitute( InputIterator first, InputIterator last,
                 char const* values )
{
    char lookup[UCHAR_MAX+1];
    for (int c = 0; c != sizeof lookup; ++c)
        if (std::isupper(c))
            lookup[c] = values[c - 'A'];
        else if (std::islower(c))
            lookup[c] = values[c - 'a' + 26];
        else
            lookup[c] = c;
    // Further adjustments to the table can be made here
    std::transform( first, last, first,
                     [&] (unsigned char c) {return lookup[c];} );
}

演示。这取决于普通字符集应该很容易满足的东西。该表也可以在其他位置创建,并通过未包装的单行传递以进行转换。这对于大型字符串转换特别有效,因为在 transform 中的隐式循环中不需要分支。

那么,您想使用原始字符在字母表中的位置将字符串中的每个字符替换为键盘字符串中的字符吗?

我会考虑使用映射字母字符到键盘字符。然后遍历字符串并替换其字符。

#include <string>
#include <algorithm>
#include <map>
int main(int argc, char* argv[])
{
    std::map<char, char> alphabetToKeyboard;
    alphabetToKeyboard['A'] = 'A';
    alphabetToKeyboard['B'] = 'Z';
    alphabetToKeyboard['C'] = 'E';
    std::string str = "ABC";
    std::transform(str.begin(), str.end(), str.begin(), [&alphabetToKeyboard](char c) {
        return alphabetToKeyboard[c];
    });
    return 0;
}