我想用一个字符串替换字符串中的一个字符。我可以就地替换吗?因为新字符串的长度大于原始字符串。问题是我可以使用额外的缓冲区吗?例如
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++初始化
4条答案
按热度按时间lbsnaicq1#
std::string
有一个replace
成员,但它是根据数字位置工作的,而不是字符串的先前内容。因此,通常必须在循环中将它与find
成员组合在一起,如下所示:就我个人而言,我很少关心字符串调整大小的频率,但如果这是一个主要问题,您可以使用
std::count
来查找old
字符串的出现次数,乘以新旧字符串之间的大小差异,然后使用std::string::reserve()
保留足够的空间。reserve
是在C++11中添加的-旧的实现不会有它。虽然这与你使用的字符串无关,但如果替换字符串包含被替换值的示例,这将无法正常工作。如果你需要处理这个问题,你需要在字符串中提供每次搜索开始的偏移量:
或者,在这种情况下,您可能更喜欢
for
循环:j9per5c42#
我想你误解了C++ std::string。它实际上可以动态地改变字符串的长度。在内部进行堆分配,如果需要的话会增加缓冲区。
ippsafx73#
下面是一个最小化赋值和分配数量的代码。它基于以下类似问题的答案:https://stackoverflow.com/a/32322122/3903076
替换字符串长度为0或1的情况将分别处理。否则,字符串必须增长。
如果没有足够的容量,那么无论如何都需要一个外部缓冲区,所以我们只需要进行复制替换和交换。
有趣的情况是,当字符串已经有足够的容量时,我们实际上可以做一个非平凡的就地替换。我们用反向复制替换来做这件事,当我们不需要替换任何其他东西时停止。
这可以在函数的最后一行看到。
下面是
replace_with_range_copy
算法的实现:ilmyapht4#
我尝试了这个老式的东西,我认为它的工作。在这里它是。我不知道这将工作的编码以外的ascii。