C++ 根据地图替换所有引用

C++ 根据地图替换所有引用,c++,C++,这个问题可能已经回答了,但我还没有找到答案 假设我有一个std::map,它包含一对字符串 我检查过了,这很接近,但并不完美: 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) {

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

假设我有一个
std::map
,它包含一对字符串

我检查过了,这很接近,但并不完美:

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
请注意:映射可以包含更多项,并且项可以在格式化程序中多次出现


2020年的方法是什么,我希望它有效且快速,因此我会避免在地图上重复多次。

可能会有新的库,但没有新的算法比我们目前拥有的更快

假设您的格式意味着变量的
$
,您可以搜索第一个
'$'
,阅读
在映射中搜索该变量,然后执行替换。这使您可以跳过替换,也可以对其进行处理(即,在一个变量可以引用另一个变量的情况下,使其递归)

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

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

我在我的工作中有这样一个实现。变量必须位于括号之间,并且可以包含多个参数以进一步调整数据。有关于该函数所支持的内容的文档,并且在编写时,您可以轻松地扩展该类以添加更多功能。它可能与您正在寻找的功能不是一对一的匹配,但它向您展示了实现该功能的方式并不是20种。

“这会起作用”,原因还不完全清楚。总之,
std::string::find
std::string::replace
有什么问题吗?甚至
std::regex\u replace
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".