如何有效地用不同的整数元素替换字符字符串的元素

How to efficiently replace elements of char string with different integer elements?

本文关键字:元素 整数 字符 字符串 替换 有效地      更新时间:2023-10-16

我希望用整数元素替换字符串的元素。我想用1代替AB2代替,C3代替,用4代替D

我怎样才能有效地做到这一点?

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
    std::string str = "ABCDDCBA";
    std::replace(str.begin(), str.end(), 'A', '1'); // Replacing 
    std::replace(str.begin(), str.end(), 'B', '2');  
    std::replace(str.begin(), str.end(), 'C', '3'); 
    std::replace(str.begin(), str.end(), 'D', '4');  
    // ...
    std::cout << str << std::endl; // displaying 
    return 0;
}

您的方法对于将任意字符替换为另一个任意字符非常有效。

但是,目前您将连续的拉丁字母替换为连续的整数,因此您可以利用 ASCII 表示形式也是连续的这一事实:

for(char& c : str)
     c += '1' - 'A';

当然,这取决于本地字符编码来表示具有连续值的连续拉丁字母,例如 ASCII。它还取决于连续表示的数字,但这是标准规定的。

此外,此方法目前没有检查替换字符,并且会更改所有遇到的字符。这不是输入字符串的问题,但如果您打算只替换某些类型的字符而保留其他字符,则需要添加条件检查。

或者你可以尝试输入字符串只包含ASCII格式的大写字母

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
std::string str = "ABCDDCBA";
for(int i=0;i<str.size();i++)
{
    str[i]=str[i]-'A'+'0';
}
std::cout << str << std::endl; // displaying 
return 0;
}

大概你的意思是在一次遍历中替换?有华而不实C++标准库的方法可以做到这一点,或者您甚至可以使用 std::regex 来解决它。但是,在std::string类上利用重载的[]运算符在性能方面将很难被击败,这是显而易见的。

for (std::size_t i = 0; i < str.size(); ++i){
    switch (str[i]){
    case 'A':
        str[i] = '1';
        break;
    case 'B':
        /*etc*/
    }
}

如果要转换多个字符(我从字面上理解了您的问题,即您只想映射 A、B、C 和 D),请考虑定义一个描述转换的 const char[] 数组;依赖特定字符的值并不是严格意义上的可移植C++

一个有趣的方法是使用每个字符的 ASCI 值:举例:int('A') = 65,int('B') = 66,所以你只需要做一个 boucleval = int(c) - 64;(仅当您有maj char时才有效)

O(n) 中的一个提案

void MyReplaceFunction(char& c)
{
    static const int delta='A'-'1';
    if(c>='A' && c<='Z')
    {
        c-=delta;
    }
}
std::for_each(str.begin(), str.end(), MyReplaceFunction);