我希望用整数元素替换字符串的元素。我想将A
替换为1
,B
替换为2
,C
替换为3
,D
替换为4
}。
我怎样才能有效地做到这一点?
#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;
}
答案 0 :(得分:5)
使用其他任意字符替换任意字符非常有效。
但是,目前您使用连续整数数字替换连续拉丁字母,因此您可以利用ASCII表示也是连续的这一事实:
for(char& c : str)
c += '1' - 'A';
当然,这取决于本机字符编码来表示具有连续值的连续拉丁字母,例如ASCII。它还取决于连续表示的数字,但这是标准规定的。
此外,此方法当前没有检查替换字符,并将更改所有遇到的字符。这不是输入字符串的问题,但如果您只想更换某些类型的字符并保持其他字符不受影响,那么您需要添加条件检查。
答案 1 :(得分:1)
大概你的意思是在一次遍历中做替换?有一些华而不实的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 ++。
答案 2 :(得分:1)
或者你可以尝试输入字符串只包含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;
}
答案 3 :(得分:0)
一个有趣的方法是使用每个char的ASCI值: 例如:int(&#39; A&#39;)= 65,int(&#39; B&#39;)= 66所以你只需要做一个 val = int(c) - 64; (仅当你有maj char时才有效)
答案 4 :(得分:0)
O(n)中的一项提案
=VLOOKUP(EOMONTH(DATEVALUE(B2&" 16"),0),A:C,3,FALSE)