好的C++字符串操作库

41

对于我的批判std::string和std::wstring,我感到很抱歉。它们相当有限且远非线程安全。就性能而言,它们也不那么好。我想要简单的功能:

  1. 将字符串分割成数组/向量/列表
  2. 简单且直观的不区分大小写查找和替换
  3. 支持国际化(i18n),无需担心字符串或宽字符串
  4. 转换为和从int、float、double
  5. 转换为和从UTF-8、UTF-16和其他编码
  6. 线程安全/可重入
  7. 小占用内存且没有依赖项
  8. 高度可移植且跨平台

我发现Qt QString很有用,还发现CBString http://bstring.sourceforge.net/bstrFAQ.shtml

有任何其他建议和比较?谢谢。

7个回答

29

C++字符串工具包(StrTk)库是一个免费的库,它由强大、优化和可移植的通用字符串处理算法和过程组成,适用于C++语言。该库旨在易于使用和集成到现有代码中。

该库具有以下功能:

  • 通用字符串分词器和标记迭代器
  • 分割例程
  • 用户指定的分隔符和分割策略(简单和基于正则表达式等)
  • 数据与十六进制和base-64之间的转换
  • 原地删除和替换例程
  • 通配符匹配和全局匹配
  • 快速的二维标记网格处理
  • 可扩展的字符串处理模板

还有更多...

兼容的C++编译器:

  • GCC 4.0+
  • Intel C++编译器9.0+
  • Microsoft Visual C++ 8.0+
  • Comeau C/C++ 4.1+

来源:


23
好的,谢谢你!我会看一下。 - Viet

12

4
谢谢John。在发布帖子之前,我已经完成了我的功课。但这并不简单也不直观。我无法使用分割功能,因为它没有返回空字符串的选项。 - Viet
啊,你打败了我!我还想补充一下,除了字符串算法之外,Boost库中还有许多与字符串操作相关的其他库。这里是一个链接(http://www.boost.org/doc/libs?view=category_String),可以查看该类别的内容! - SingleNegationElimination
@Viet,你已经看过这个了吗?或者这对你有帮助吗?我可以保证,在字符串操作方面,除了算法之外,还有更多的boost库(正如Token所指出的)。你也可以编写自己的函数来处理字符串,并在继续使用这些函数之前检查它们是否为空。 - John T
是的,可能吧。但我觉得 QString 更简单、更直观。不管怎样,还是谢谢你。 - Viet
我不会说Boost在任何方面都有“小印记”。 - Simon

10

我不确定我同意。字符串由于开销问题确实不应该是线程安全的,除了引用计数(如果适用)。你想要的大部分其他功能都会使字符串变得过于混杂。同样地,去除依赖将削弱它们与流协作的能力。

我建议我们可以从不可变的字符串类中受益,尤其是那些不具有内存所有权或终止条件的类。我以前写过这样的类,它们非常有帮助。


谢谢Steven。但字符串操作真的很困扰我。我在C ++中需要大量进行字符串处理。在PHP,Perl和Python中,我可以毫不费力地完成任务,但在C ++中却很难。 - Viet
4
但是它们有用 C 编写的底层引擎 :) 你的理由不足以避免在 C 和 C++ 中拥有一个好的、强大的字符串操作库。 - Viet
1
我的观点是脚本语言与通用编程语言有不同的目标。像 PHP 这样的脚本语言积极鼓励堆积功能,直到一个类成为垃圾驳船,以追求方便。而对于通用编程语言而言,拥有如此多的功能,您绝对需要组织它,以免变得无法承受。 - Steven Sudit
1
这篇文章最近遭到了一些负面评价。虽然那是你的权利,但我很好奇原因是什么。 - Steven Sudit

3

Bstring - 尽管我自己从未尝试过,但他们网站上呈现的功能集和速度。在GPL或BSD许可证下选择也具有很好的自由度。

此外,名称表明它更好,他们怎么可能撒谎呢? :)


谢写了SuperFastHash,但事实证明它并不那么快。Murmur2更快,分布更好。 - Steven Sudit
谢谢。我在我的查询中找到了这个库 :) - Viet
是的,适合英语 :) - Viet

3
我发现wxString很方便使用,它有许多功能。虽然它是更大的库(wxWidgets)的一部分,但当您只想使用字符串时可能会显得太大。 当您只使用包含wxString和其他“少量”组件的wxBase时,它也可以在没有GUI组件的情况下工作。
编辑:这里是链接到文档。它接受std::string的标准函数以及其他一些函数。每当我需要解析一些文本时,我总是觉得BeforeFirst()和AfterFirst()非常方便。而且它的文档真的很好。

2
请注意:wxBase库可以在不使用wxWidgets的情况下使用。我知道这一点,因为18年前,我是其中的原因之一。 - breakpoint
请注意,wxString存在一些神秘的引用计数。它类似于std::shared_ptr,但不是线程安全的。唯一深拷贝的方法是使用wxString :: Clone()。 - Ronen

2
我强烈推荐使用ICUUnicodeString,因为它支持所有常见的字符串操作函数,以及i18n支持。
不知道ICU是什么?以下是来自Wikipedia的摘录:
国际Unicode组件(ICU)是一个成熟的C/C++和Java库的开源项目,用于支持Unicode、软件国际化和软件全球化。ICU在许多操作系统和环境中都有广泛的可移植性。它可以使应用程序在所有平台和C、C++和Java软件之间获得相同的结果。ICU项目由IBM和许多其他公司赞助、支持和使用。

1

对于转换,您可以始终分解并使用C库cstdlib。

#include <cstlib>
#include <iostream>

int main()
{
   std::string num;

   std::cin >> num;

   someFunc(atoi(num));
   someOtherFunc(atof(num));
   return 0;
}

atoi = 将ASCII转换为整数 atof = 将ASCII转换为浮点数

至于查找,请使用在algorithm头文件下定义的STL函数 "find",或者使用find_first_of(或类似函数)。我还相信您可以使用std :: string初始化字符向量,不过这只是猜测。


谢谢,但我需要不区分大小写和国际化支持。 - Viet
我不确定你的意思。你在字符串本身中是什么意思? - jkeys
伙计们,从头开始自己编写并不是重点!无论如何还是谢谢。 - Viet
不,先生,我只是更熟悉C方法。如果我尝试使用stringstream来展示,我可能会感到不舒服,因为我可能会弄错。请随意编辑我的帖子。 - jkeys
atoi 不提供任何诊断信息或任何错误信号的方法。我建议使用 strotol 代替。 - mloskot
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接