在字符串中替换多对字符

Replace multiple pair of characters in string

本文关键字:字符 替换 字符串      更新时间:2023-10-16

我想替换所有出现'a'with'b'的'a'和'd'的'd'。

我当前的解决方案是:

std::replace(str.begin(), str.end(), 'a', 'b');
std::replace(str.begin(), str.end(), 'c', 'd');

使用STD可以在单个功能中进行吗?

棘手的解决方案:

#include <algorithm>
#include <string>
#include <iostream>
#include <map>
int main() {
   char r; //replacement
   std::map<char, char> rs = { {'a', 'b'}, {'c', 'd'} };
   std::string s = "abracadabra";
   std::replace_if(s.begin(), s.end(), [&](char c){ return r = rs[c]; }, r);
   std::cout << s << std::endl;
}

编辑

为了取悦所有效率自由基,可以更改解决方案,以免为每个非现有键附加rs地图,而保持棘手的风味。这可以如下完成:

#include <algorithm>
#include <string>
#include <iostream>
#include <map>
int main() {
   char r; //replacement
   std::map<char, char> rs = { {'a', 'b'}, {'c', 'd'} };
   std::string s = "abracadabra";
   std::replace_if(s.begin(), s.end(), [&](char c){ return (rs.find(c) != rs.end())
                                                        && (r = rs[c]); }, r); 
   std::cout << s << std::endl; //bbrbdbdbbrb
}

[live demo]

如果您不喜欢两个通过,则可以做一次:

 std::transform(std::begin(s), std::end(s), std::begin(s), [](auto ch) {
    switch (ch) {
    case 'a':
      return 'b';
    case 'c':
      return 'd';
    }
    return ch;
  });