我希望用整数元素替换字符串的元素。我想用1代替A,用2代替B,用3代替C,用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;
}发布于 2017-01-13 11:43:40
您的方法对于将任意字符替换为另一个任意字符非常有效。
但是,目前您用连续整数位替换连续拉丁字母,因此您可以利用ASCII表示形式也是连续的这一事实:
for(char& c : str)
c += '1' - 'A';当然,这取决于本地字符编码来表示具有相邻值的连续拉丁字母,如ASCII所做的那样。它还依赖于连续表示的数字,但这是标准规定的。
此外,此方法目前没有检查替换字符,并将更改所有遇到的字符。这不是输入字符串的问题,但如果您只打算替换某些类型的字符,而保留其他类型的字符,则需要添加条件检查。
发布于 2017-01-13 11:38:37
您的意思大概是在一次遍历中进行替换吗?有一些花哨的C++标准库( Standard )方法可以这样做,或者您甚至可以用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++。
发布于 2017-01-13 11:39:15
或者,如果输入字符串仅包含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;
}https://stackoverflow.com/questions/41633732
复制相似问题