C++ 在一行中替换多个字符串

C++ 在一行中替换多个字符串,c++,string,c++11,C++,String,C++11,我有一个sql语句,为了调试,我想打印它。该语句包含占位符,我希望在打印前将占位符填充到一条指令行中。这是有效的还是无效的 std::string query("SELECT A, B FROM C WHERE D = ? and E = ?;"); std::cout << query.replace(query.find("?"), 1, "123").replace(query.find("?"), 1, "234") << std::endl; 这是说明的顺序

我有一个sql语句,为了调试,我想打印它。该语句包含占位符,我希望在打印前将占位符填充到一条指令行中。这是有效的还是无效的

std::string query("SELECT A, B FROM C WHERE D = ? and E = ?;");
std::cout << query.replace(query.find("?"), 1, "123").replace(query.find("?"), 1, "234") << std::endl;
这是说明的顺序

找到第一个问号的位置 替换查询中的第一个字符串 查找第一次更换后第二个问号的位置 替换查询中的第二个字符串 保证或可能在两个替换操作之前调用两个查找操作,如

找到第一个问号的位置 在第一次更换前找到第二个问号的位置 替换查询中的第一个字符串 替换查询中的第二个字符串 我这样问是因为:

几乎所有C++算子操作数的排序 包括函数参数在 函数调用表达式和函数的求值顺序 未指定任何表达式中的子表达式。编译器可以 按任意顺序计算操作数,并且在 再次计算相同的表达式

编辑:
在这个项目中不可能使用第三方依赖关系。

在计算顺序规则中,我找不到任何严格指定链式函数的函数参数顺序的东西。也就是说,在您的情况下,您可以知道:

第一次替换在第二次替换之前排序,因为第二次替换根据其返回值进行操作

每个find调用都在使用其返回值作为参数的replace之前排序


但是您想要的是在第二次查找之前对第一次替换进行排序,并且没有这样的保证。有关参考,请参阅规则。

我在求值顺序规则中找不到任何严格指定链式函数的函数参数顺序的内容。也就是说,在您的情况下,您可以知道:

第一次替换在第二次替换之前排序,因为第二次替换根据其返回值进行操作

每个find调用都在使用其返回值作为参数的replace之前排序

但是您想要的是在第二次查找之前对第一次替换进行排序,并且没有这样的保证。有关参考信息,请参阅规则。

您可以多次使用:

#include <boost/algorithm/string/replace.hpp>
#include <iostream>
#include <string>

int main() {
    std::string query("SELECT A, B FROM C WHERE D = ? and E = ?;");
    for(auto replacement : {"123", "1"})
        boost::algorithm::replace_first(query, "?", replacement);
    std::cout << query << '\n';
}
请注意,这种简单的字符串替换对于需要引用的替换字符串不起作用。

您可以多次使用:

#include <boost/algorithm/string/replace.hpp>
#include <iostream>
#include <string>

int main() {
    std::string query("SELECT A, B FROM C WHERE D = ? and E = ?;");
    for(auto replacement : {"123", "1"})
        boost::algorithm::replace_first(query, "?", replacement);
    std::cout << query << '\n';
}
请注意,这个简单的字符串替换对于需要引用的替换字符串不起作用。

在query.replacequery.find?,1123.replacequery.find?,1234中

查询。查找?相互之间没有顺序。 所以结果在可能的序列之间是不可预测的。

在query.replacequery.find?,1123.replacequery.find?,1234中

查询。查找?相互之间没有顺序。
因此,可能的序列之间的结果是不可预测的。

boost不是第三方依赖项吗?它是第三方依赖项,我们不能使用boost,因为我们使用的库动态链接boost,我们不知道版本和构建标志。@ThomasSablik boost::algorithm::replace\u first在标头中实现,不需要连接boost共享/静态libs。尽管如此,这可能会导致您动态加载的未知boost版本违反ODR。boost不是第三方依赖项吗?它是第三方依赖项,我们不能使用boost,因为我们使用的库动态链接boost,我们不知道版本和构建标志。@ThomasSablik boost::algorithm::replace_first在头,不需要连接boost共享/静态libs。尽管如此,对于动态加载的未知boost版本,这可能会导致ODR冲突。用lambda包装它仍然可以作为一个线性程序吗?std::cout@KillzoneKid:问题不在于找到一个有效的单行程序,而在于更多地理解这是否有效,以及避免将来的错误。但是我喜欢使用lambda的想法。用lambda包装它仍然可以作为一个衬里吗?std::cout@KillzoneKid:问题不在于找到一个有效的单行程序,而在于更多地理解这是否有效,以及避免将来的错误。但我喜欢使用lambdas的想法。未定序或不定序?@Deduplicator:可能因编译器而异,甚至因运行不同而有所不同。否。它是哪一个是由标准定义的。前者没有后者那么拘束,我认为是后者。两者都允许从一个运行/编译器/版本到下一个运行/编译器/版本的变化。未排序或未确定排序?@Duplicator:可能因编译器而异,甚至可能因不同的运行而有所不同。否。它是哪一个是由标准定义的。前者没有后者那么拘束,我认为是后者。不过,这两个版本都允许从一个运行/编译器/版本到下一个运行/编译器/版本的变化。