分别用2个其他字符串替换字符串

时间:2014-11-27 18:28:30

标签: c++ string replace find

我一直在寻找用另一个字符串中的字符替换字符串中的字符来比较另一个字符串。 好吧,很难描述这个,代码会更好:

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. 查找(可能是Find()?)str中的字母并以字母表形式获取i变量。
  2. 使用i-variable想要获取pos然后在键盘字符串中获取字母。
  3. 希望你理解我的意思,谢谢你。

    我虽然关于replace(),find()和swap(),但是没有用,我可能做错了。 提前谢谢!

    编辑:嗯,我确定你不会理解任何东西,想象str =“你好”,我想用Y替换H(alphabet = H - &gt; keyboard = I)? (字母表在字母表字符串中获取H的位置,我们在i中记住这个位置,我们键盘[i]),这就是我想要做的。

2 个答案:

答案 0 :(得分:3)

我建议

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)一样长的范围。 Demo

我们的想法是使用要确定其类型的迭代器迭代范围的所有元素 - 即我们可以同时使用char const[]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];} );
}

Demo。这取决于普通字符集应该足够的东西。该表也可以在其他地方创建并通过展开的单行传递到转换。这对于大型字符串转换尤其有效,因为transform中的隐式循环中不需要分支。

答案 1 :(得分:1)

那么,你想用字母表中原始char的位置用键盘字符串中的char替换字符串中的每个字符?

我会考虑使用地图字母char来键盘char。然后迭代字符串并替换它的字符。

#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;
}