- 使用
String::with_capacity
和 push_str
方法:
fn main() {
let strings: Vec<String> = vec![
"Hello".to_string(),
", ".to_string(),
"world!".to_string(),
];
let mut result = String::with_capacity(strings.iter().map(|s| s.len()).sum());
for s in strings {
result.push_str(&s);
}
println!("{}", result);
}
- 内存管理原理:
String::with_capacity
方法预先分配足够的内存空间来存储拼接后的字符串。这里通过计算 Vec<String>
中所有字符串的长度之和来确定所需的容量。这样在拼接过程中,就避免了每次追加字符串时都可能发生的内存重新分配。
push_str
方法将一个字符串切片追加到 String
中,它不会重新分配内存(前提是当前 String
的容量足够),只是将切片的内容复制到已分配的内存空间中。
- 使用
iter::collect
方法结合 Formatter
:
fn main() {
let strings: Vec<String> = vec![
"Hello".to_string(),
", ".to_string(),
"world!".to_string(),
];
let result: String = strings.iter().collect();
println!("{}", result);
}
- 内存管理原理:
collect
方法会根据 Iterator
生成的元素类型,确定合适的收集器。对于字符串拼接,它会预先计算所需的容量,然后一次性分配足够的内存来存储拼接后的结果。在收集过程中,各个字符串元素被复制到已分配好的内存中,同样避免了频繁的内存重新分配。