我在哪里可以找到操作的复杂性?

时间:2017-12-15 10:55:21

标签: rust

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)操作。

虽然这是很多工作。那么sstd::str的情况呢?我试图做同样的事情但被困在this mess

Rust中操作复杂性是否有更容易访问的资源?

list for Python之类的东西会很棒。

2 个答案:

答案 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)

Stringstr为所有操作提供相同的复杂性保证。事实上,String(包括chars()are actually operations on str上的大多数操作使用从Stringstr的隐式转换(转换是免费的,因为它们共享相同的低级别表示。)