我想用字符串替换字符串中的字符。我可以就地进行吗?由于新字符串的长度大于原始字符串的长度,问题是我可以使用额外的缓冲区吗?例如
void replaceChar(std::string &input, std::string replacementString, char charToReplace) { //some code here. No additional buffer } void main(){ std::string input = "I am posting a comment on LinkedIn"; std::string replacementString = "pppp"; char charToReplace = 'o'; replaceChar(input, replacementString, charToReplace); }
我只想要策略(算法)。如果设计算法时要记住某种语言,那将是很好的,一旦像c ++这样初始化字符串,该语言就不会动态地增加或减少字符串的长度
std::string有一个replace成员,但是它根据数字位置而不是字符串的先前内容工作。因此,通常必须将其与find成员组合成一个循环,如下所示:
std::string
replace
find
std::string old("o"); int pos; while ((pos = x.find(old)) != std::string::npos) x.replace(pos, old.length(), "pppp");
就我个人而言,我很少担心字符串的大小调整频率,但是,如果这是一个主要问题,您可以使用它std::count来查找old字符串的出现次数,乘以新旧字符串之间的大小差,以及用于std::string::reserve()保留足够的空间。但是请注意,这reserve是C ++ 11中添加的-较早的实现将没有它。
std::count
old
std::string::reserve()
reserve
编辑:尽管它与您使用的字符串无关,如@ipc指出,但是如果替换字符串包含要替换的值的实例,则此操作将无法正常工作。如果需要处理,则需要在字符串中提供偏移量,以开始每个搜索:
int pos = 0; while ((pos = x.find(old, pos)) != std::string::npos) { x.replace(pos, old.length(), rep); pos += rep.length(); }
或者,for在这种情况下,您可能更喜欢循环:
for
std::string old("o"); std::string rep("pop"); for (int pos=0; (pos = x.find(old, pos)) != std::string::npos; pos+=rep.length()) { x.replace(pos, old.length(), rep); }