在this answer中提到了一个字符串
获得字符数的s.chars().count()
是O(n)操作。
对于简单的ASCII字符串,使用s.len()
获取字节数也可以。当使用检查来确保所有这些字节实际上是ASCII时,这可能是安全的。
我想知道该操作的复杂程度。它可能仍然必须像在C中一样找到字符串的结尾并且是O(n)。
我试着查找它并找到了documentation of the std::string::String
,
适用于适当的s
。然而,它并没有说明它的复杂性。查看源代码,只需执行此操作self.vec.len()
。所以我们去查看vector docs并发现这只是返回一个存储的长度self.len
,这意味着这确实是一个O(1)操作。
虽然这是很多工作。那么s
是std::str的情况呢?我试图做同样的事情但被困在this mess。
Rust中操作复杂性是否有更容易访问的资源?
像list for Python之类的东西会很棒。
答案 0 :(得分:6)
除了performance section on collections之外,我认为目前没有像你引用的Python那样的公共列表。
对于str
,确定其长度是O(1)操作,因为a string slice consists of a pointer and length:
// We can re-build a str out of ptr and len. This is all unsafe because
// we are responsible for making sure the two components are valid:
let s = unsafe {
// First, we build a &[u8]...
let slice = slice::from_raw_parts(ptr, len);
// ... and then convert that slice into a string slice
str::from_utf8(slice)
};
答案 1 :(得分:3)
String
和str
为所有操作提供相同的复杂性保证。事实上,String
(包括chars()
)are actually operations on str
上的大多数操作使用从String
到str
的隐式转换(转换是免费的,因为它们共享相同的低级别表示。)