NSString的高效字符处理
Efficient character processing of NSString
我需要对 Cocoa 中的大字符串进行一些字符处理(来自 Objective-C 或 Swift),其中:
- 传入一个
NSString
的输入字符串有n个字符
- 结果应 return 编辑在
NSString
中
- 可以对字符串中的字符进行简化假设。我的意思是我们可以假设它们都是 ASCII,或者都是单个代码单元 UTF8,甚至都是
unichar
(以便进行索引和长度计算 O(1))
为了示例,假设处理是 rot13 混淆。
我想做 space 并且时间高效:
- 我想从源字符串(可能是副本)中获取一个可变的字符缓冲区
- 我想就地改变那个缓冲区
- 我想 return 在构建的
NSString
中改变缓冲区而不做另一个副本。
我想要space复杂度≤2*n+O(1)。
我想要时间复杂度 O(n) - 常数越小越好。
NSString
API 可以轻松做到这一点,但效率太低,需要大量的字符到字符串的来回转换。我这里追求的是C级高效的字符处理
NSString
API 还允许使用 dataUsingEncoding:
或 UTF8String
等方法获取字符缓冲区。但是我找不到使用 API 的方法,我只复制一次字符进行处理。
分配 unichar
的缓冲区。复制到带 getCharacters(range:)
的缓冲区中。操纵。使用 init(charactersNoCopy:length:freeWhenDone:)
.
转换回来
unichar
是 UTF-16。如果您愿意假设没有任何东西需要代理字符(例如,如果您假设它是 ASCII),那么您可以根据 length
(它将是 2 * 长度)分配您的缓冲区。如果你想更灵活,但仍然以 2-3 倍的内存需求为代价的 O(1),那么使用 maximumLengthOfBytes
。如果你想更灵活,但愿意接受 O(n) 步骤(我假设你不是),那么使用 lengthOfBytes
.
NSString
在内部存储为 UTF-16 有点常见,因此这往往是一个非常快速的转换。也就是说,如果您对字符串有足够的了解,并且愿意编写额外的代码来直接操作编码,那么请查看 fastestEncoding
.
我需要对 Cocoa 中的大字符串进行一些字符处理(来自 Objective-C 或 Swift),其中:
- 传入一个
NSString
的输入字符串有n个字符 - 结果应 return 编辑在
NSString
中
- 可以对字符串中的字符进行简化假设。我的意思是我们可以假设它们都是 ASCII,或者都是单个代码单元 UTF8,甚至都是
unichar
(以便进行索引和长度计算 O(1))
为了示例,假设处理是 rot13 混淆。
我想做 space 并且时间高效:
- 我想从源字符串(可能是副本)中获取一个可变的字符缓冲区
- 我想就地改变那个缓冲区
- 我想 return 在构建的
NSString
中改变缓冲区而不做另一个副本。
我想要space复杂度≤2*n+O(1)。
我想要时间复杂度 O(n) - 常数越小越好。
NSString
API 可以轻松做到这一点,但效率太低,需要大量的字符到字符串的来回转换。我这里追求的是C级高效的字符处理
NSString
API 还允许使用 dataUsingEncoding:
或 UTF8String
等方法获取字符缓冲区。但是我找不到使用 API 的方法,我只复制一次字符进行处理。
分配 unichar
的缓冲区。复制到带 getCharacters(range:)
的缓冲区中。操纵。使用 init(charactersNoCopy:length:freeWhenDone:)
.
unichar
是 UTF-16。如果您愿意假设没有任何东西需要代理字符(例如,如果您假设它是 ASCII),那么您可以根据 length
(它将是 2 * 长度)分配您的缓冲区。如果你想更灵活,但仍然以 2-3 倍的内存需求为代价的 O(1),那么使用 maximumLengthOfBytes
。如果你想更灵活,但愿意接受 O(n) 步骤(我假设你不是),那么使用 lengthOfBytes
.
NSString
在内部存储为 UTF-16 有点常见,因此这往往是一个非常快速的转换。也就是说,如果您对字符串有足够的了解,并且愿意编写额外的代码来直接操作编码,那么请查看 fastestEncoding
.