C++ 如何在C++;?

C++ 如何在C++;?,c++,string,C++,String,假设我从API中获得几百行字符串形式的文本(C++),并将德语的umlauts(如äorö)散布到这些数据中,它们需要替换为ae和oe。 我熟悉编码(嗯,我读过),解决这个问题很简单(基本上,搜索字符串,删除字符,然后添加另外两个字符) 不过,我对C++的了解不够快。我刚刚偶然发现StringBuilder(),它提高了很多速度,但我很好奇是否有更好的或更聪明的方法来做这件事? < P>如果你必须在如此小的范围内提高效率,考虑在两个阶段进行替换: 第一阶段计算替换后结果中的字符数。检查字符串,

假设我从API中获得几百行字符串形式的文本(C++),并将德语的umlauts(如äorö)散布到这些数据中,它们需要替换为ae和oe。 我熟悉编码(嗯,我读过),解决这个问题很简单(基本上,搜索字符串,删除字符,然后添加另外两个字符)


不过,我对C++的了解不够快。我刚刚偶然发现StringBuilder(),它提高了很多速度,但我很好奇是否有更好的或更聪明的方法来做这件事?

< P>如果你必须在如此小的范围内提高效率,考虑在两个阶段进行替换:

  • 第一阶段计算替换后结果中的字符数。检查字符串,并将
    1
    添加到每个普通字符的计数中;对于ä或ö等字符,添加
    2
  • 此时,您有足够的信息为结果分配字符串。制作一个字符串,长度与第一阶段计算的长度相同
  • 第二个阶段执行实际的替换:再次检查字符串,复制常规字符,并用它们对应的对替换umlauted字符

如果你必须在这样的小规模上提高效率,考虑两个阶段的替换:

  • 第一阶段计算替换后结果中的字符数。检查字符串,并将
    1
    添加到每个普通字符的计数中;对于ä或ö等字符,添加
    2
  • 此时,您有足够的信息为结果分配字符串。制作一个字符串,长度与第一阶段计算的长度相同
  • 第二个阶段执行实际的替换:再次检查字符串,复制常规字符,并用它们对应的对替换umlauted字符


当它以UTF-8编码时,德语umlauts都是unicode中的双字节值,它们的替代品如
ae
oe
。因此,当您使用char[]而不是字符串时,您不必重新分配任何内存,只需在迭代char[]时替换字节即可。

当它用UTF-8编码时,德语umlauts都是unicode中的两个字节值,它们的替换形式也一样,如
ae
oe
。因此,当您使用char[]而不是字符串时,您不必重新分配任何内存,只需在迭代char[]时替换字节即可。

(另外)这可以在单个缓冲区中完成。放大原始缓冲区,从最后一个字符复制到第一个字符。一个简单的循环,真的。(附加)它可以在一个缓冲区中完成。放大原始缓冲区,从最后一个字符复制到第一个字符。一个简单的循环,真的。用UTF8比较容易:胡,欧和艺龙网是两字节长的,AE OE和UE。BTW,我问这个问题,实际上是学习C++的一些东西(我从链接的String Buubter文章中学到了很多)-我的代码足够快,我的目的是:-输入字符串的编码是什么?如其他响应所示,转换策略由所涉及的编码控制。如果你能指出这个,我相信你会得到更多的指针……@ BigGITP::<代码> StringBuilder <代码>在C++中是没有用的…首先,您必须正确使用
std::string
。然而,真正的问题是字符串的编码是什么。你能指出带umlauts的字母和带尾随
e
的字母是如何在字节级别表示的吗?@AlexandreC.:除非它们是三个字节,否则它们是两个字节:ä也可以是
0x61 0xCC 0x88
。在后一种情况下,很容易删除UMLUT:只需删除CC 88。使用UTF8比较容易:胡、欧和艺龙网是两字节长的,AE OE和UE。BTW,我问这个问题,实际上是学习C++的一些东西(我从链接的StrugBuudter文章中学到了很多)。-我的代码对于我的目的来说足够快:-)输入字符串的编码是什么?如其他响应所示,转换策略由所涉及的编码控制。如果你能指出这个,我相信你会得到更多的指针……@ BigGITP::<代码> StringBuilder <代码>在C++中是没有用的…首先,您必须正确使用
std::string
。然而,真正的问题是字符串的编码是什么。你能指出带umlauts的字母和带尾随
e
的字母是如何在字节级别表示的吗?@AlexandreC.:除非它们是三个字节,否则它们是两个字节:ä也可以是
0x61 0xCC 0x88
。在后一种情况下,很容易删除umlaut:只需删除CC 88。@BirgitP
std::string.c_str()
是一个常量时间操作,返回指向std::string使用的内部缓冲区的指针。因此没有任何开销,也不必将其转换回去。只有当这里的“unicode”指的是UTF-8时才是这样。如果是UTF-16,“ö”和“oe”的字节计数不同。如果它是拉丁文1,那么它又是微不足道的。@cmaster您可以用于that@JonasWielicki啊,谢谢。因此,在C++11中现在有六种不同的方法来获取第一个字符的地址:
begin()
cbegin()
操作符[]
front()
C_str()
数据()
。令人印象深刻的……@ MalSalter,我没有使用“地址”这个词而不是“指针”,我不知道C++程序员不喜欢谈论指针,但我想谈谈底层的机制。现在,
begin()。我故意排除了
rend()
,因为由于反向语义,无法返回普通的旧指针<代码>运算符[]
front()