替换基于地图的所有引用

Replace all occurrences based on map

本文关键字:引用 地图 于地图 替换      更新时间:2023-10-16

这个问题可能已经回答了,但我还没有找到。

假设我有一个std::map<string,string>,它包含<replace_all_this,to_this>

我检查了Boost的格式库,它很接近但并不完美:

std::map<string,string> m;
m['$search1'] = 'replace1';
m['$search2'] = 'replace2';
format fmter1("let's try to %1% and %2%.");
fmter % 36; fmter % 77;
for(auto r : m) {
fmter % r.second;
}
// would print "let's try to replace1 and replace2

这是可行的,但我失去了对什么的控制。事实上,我想有这样的结果:

format fmter1("let's try to $search2 and $search1 even if their order is different in the map.");
...
//print: "let's try to replace2 and replace1 even if their order is different in the map".

请注意:映射可以包含更多项,并且项可以在格式化程序中多次出现。

2020年的做法是什么,我希望它既有效又快速,所以我会避免在地图上多次迭代。

可能会有新的库,但没有新的算法能比我们迄今为止更快地做到这一点。

假设您的格式包含变量的$<name>,那么您可以搜索第一个'$',读取映射中的<name>搜索,然后进行替换。这允许您跳过替换或也处理它(即,使其递归,其中一个变量可以引用另一个变量(。

我不认为用另一种方式会更快:即,浏览映射并搜索字符串中的名称意味着你要多次解析字符串,如果你有很多变量,如果大多数变量不可能是字符串的一部分,那将是一种巨大的浪费。此外,如果你想防止某种程度的递归,这是非常复杂的。

您最终可以优化的地方是计算结果字符串的大小,并分配一次缓冲区,而不是使用+=,这可能会更慢。

我在我的快照记录器中有这样一个实现。变量必须位于方括号之间,并且可以包括多个参数来进一步调整数据。这里有关于该函数支持什么的文档,在编写时,您可以轻松地扩展类以添加更多功能。它可能与您想要的不一一匹配,但它向您表明,实现该功能的方法不存在20种。