c++ - 如何有效地用另一个 std::string 的迭代值替换 std::string 中的字符?

标签 c++ loops stdstring

我有以下字符串:

std::string str1 = "1234567890";
std::string str2 = "B-XXXX_XXX_V-XX_X";

我想遍历 str2 并将每次出现的 X 替换为 str1 中的后续值,结果是:B-1234_567_V-89_0

我有一个类似下面的解决方案,但它不是很有效(它在某一时刻起作用)。简而言之,我尝试遍历 str2 中的字符,如果字符等于“X”,则用 str1 中的递增索引替换该字符:

  int ind = 0;
  std::string pattern_char;
  for (int i = 0; i < str2.size(); i++) {
    pattern_char = str2[i];
    if (pattern_char == "X") {
      str2[i] = str1[x_ind];
      x_ind++;
    }
  }

执行此操作最有效的方法是什么?

最佳答案

您当前的实现将字符串的每个单独单元视为 std::string 而不是单个 char,这会引入一些不必要的开销。这是使用 char 的重写:

  int x_ind = 0;
  for (int i = 0; i < str2.size(); i++) {
    if (str2[i] == 'X') {    // Don't assign str2[i] to a char; use character literals
      str2[i] = str1[x_ind];
      x_ind++;
    }
  }

您可以通过使用基于范围的 for 循环来提高可读性,如下所示:

  int x_ind = 0;
  for (char& ch: str2) {
    if (ch == 'X') {
      ch = str1[x_ind];
      x_ind++;
    }
  }

关于c++ - 如何有效地用另一个 std::string 的迭代值替换 std::string 中的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61670268/

相关文章:

java - 如何将 temp 中的字符串分配给 returnString?

Bash 脚本 : for loop using a range in the form {0001. .$n}

c++ - 为什么这个编译: string = int

c++ - 将 std::string 转换为具有尾随或前导 '\0' 的 LPCSTR

c++ - 最大长度的字符串类型

c++ - 为什么这个模板特化在 GCC 中不起作用?

c++ - 不包括 Qt QMimeDatabase header

javascript - 现代 JavaScript JITer 是否需要循环中的数组长度缓存?

Java 应用程序和 C++ 应用程序集成/通信

C++ 类方法继承