替换c+中字符的sef+;使用最少的代码行数 我使用C++中的下列函数替换一组ASCII字符。 std::string debug::convertStringToEdiFormat(const char *ediBuffer) { std::string local(ediBuffer); std::replace(local.begin(), local.end(), '\037', ':'); std::replace(local.begin(), local.end(), '\031', '*'); std::replace(local.begin(), local.end(), '\035', '+'); std::replace(local.begin(), local.end(), '\034', '\''); return std::string(local); }

替换c+中字符的sef+;使用最少的代码行数 我使用C++中的下列函数替换一组ASCII字符。 std::string debug::convertStringToEdiFormat(const char *ediBuffer) { std::string local(ediBuffer); std::replace(local.begin(), local.end(), '\037', ':'); std::replace(local.begin(), local.end(), '\031', '*'); std::replace(local.begin(), local.end(), '\035', '+'); std::replace(local.begin(), local.end(), '\034', '\''); return std::string(local); },c++,string,C++,String,问题是它太长了。如果我想替换100个字符,它将有100行代码。有没有另一个函数占用更少的代码并允许我执行相同的操作?为什么不使用无序映射和一个循环 static const std::unordered_map<char, char> a = {{'\037', ':'}, {'\031', '*'}, {'\035', '+'}}; void convertStringToEdiFormat(std::string &ediBuffer) { for (auto&am

问题是它太长了。如果我想替换100个字符,它将有100行代码。有没有另一个函数占用更少的代码并允许我执行相同的操作?

为什么不使用无序映射和一个循环

static const std::unordered_map<char, char> a = {{'\037', ':'}, {'\031', '*'}, {'\035', '+'}};

void convertStringToEdiFormat(std::string &ediBuffer) {
  for (auto& c : ediBuffer)
    {
        c = a.at(c);
    }
}
static const std::无序的_映射a={{{'\037',':'},{'\031','*'},{'\035','+'};
void convertStringToEdiFormat(std::string和ediBuffer){
用于(自动&c:ediBuffer)
{
c=a.at(c);
}
}

这就是您要寻找的:

array< char, 256 > m;
// fill m
//...
m['\037'] = ':';
m['\031'] = '*';
m['\035'] = '+';
m['\034'] = '\'';
//...
string s{ "Hello world!" };
for (auto& c : s)
  c = m[c];

请参见

最佳方法是提取执行字符转换的函数/函子。 这是一个全函数函子,它可以在两个方向上执行转换

class ReplaceEncoder {
public:
    ReplaceEncoder() {
        initArray(m_encode);
        initArray(m_decode);
    }

    void updateEncoding(const std::string &from, const std::string &to) {
        assert(from.size() == to.size());
        for (int i=0; i<from.size()) {
             m_encode[from[i]] =   to[i];
             m_decode[  to[i]] = from[i];
        }
    }

    char encode(char ch) const {
         return m_encode[static_cast<unsigned char>(ch)];
    }

    char decode(char ch) const {
         return m_decode[static_cast<unsigned char>(ch)];
    }

    char operator()(char ch) const {
         return encode(ch);
    }

private:
    void initArray(std::array<char, 0x100> &arr) {
        for (size_t i = 0; i < arr.size(); ++i) {
            arr[i] = static_cast<char>(i);
        }
    }

private:
    std::array<char, 0x100> m_encoder;
    std::array<char, 0x100> m_decoder;
};

ReplaceEncoder encrypt;
encrypt.updateEncoding("absdet", "gmbstp");

string s{ "Hello world!" };
std::transform(s.begin(), s.end(), s.begin(), encrypt);
类替换编码器{
公众:
替换编码器(){
initArray(m_编码);
initArray(m_解码);
}
void updateEncoding(常量std::string&from,常量std::string&to){
断言(从.size()==到.size());

对于(int i=0;i您必须遍历字符串一次。每次调用replace时,字符串都会被遍历。使用映射来映射您的字符并替换for循环中的字符。您试图做的是非常具体的转换。如果您无法提取要替换的字符与要替换的字符之间的关系d by,恐怕你必须写尽可能多的替换行。正如@ZDF所说,有更有效的方法,比如首先使用地图。未排序的地图->无序的地图。我想自己编辑它,但如果要更改的字符少于6个,我就无法编辑(WTF?)这会在字符串上引发异常,该字符串包含不在
a
中的任何内容。这是一个小示例。您应该考虑到这一点。但某些系统会禁用异常
class ReplaceEncoder {
public:
    ReplaceEncoder() {
        initArray(m_encode);
        initArray(m_decode);
    }

    void updateEncoding(const std::string &from, const std::string &to) {
        assert(from.size() == to.size());
        for (int i=0; i<from.size()) {
             m_encode[from[i]] =   to[i];
             m_decode[  to[i]] = from[i];
        }
    }

    char encode(char ch) const {
         return m_encode[static_cast<unsigned char>(ch)];
    }

    char decode(char ch) const {
         return m_decode[static_cast<unsigned char>(ch)];
    }

    char operator()(char ch) const {
         return encode(ch);
    }

private:
    void initArray(std::array<char, 0x100> &arr) {
        for (size_t i = 0; i < arr.size(); ++i) {
            arr[i] = static_cast<char>(i);
        }
    }

private:
    std::array<char, 0x100> m_encoder;
    std::array<char, 0x100> m_decoder;
};

ReplaceEncoder encrypt;
encrypt.updateEncoding("absdet", "gmbstp");

string s{ "Hello world!" };
std::transform(s.begin(), s.end(), s.begin(), encrypt);