Kai*_*ren 22
这就是我到目前为止所做的事情(这也使借阅检查员感到高兴):
let index = xs.iter().position(|x| *x == some_x).unwrap();
xs.remove(index);
Run Code Online (Sandbox Code Playgroud)
我还在等待找到更好的方法,因为这非常难看.
注意:我的代码假定元素确实存在(因此.unwrap()).
ant*_*oyo 13
您可以使用该retain方法,但它将删除值的每个实例:
fn main() {
let mut xs = vec![1, 2, 3];
let some_x = 2;
xs.retain(|&x| x != some_x);
println!("{:?}", xs); // prints [1, 3]
}
Run Code Online (Sandbox Code Playgroud)
A.B*_*.B. 10
position()迭代器有一种方法,它返回与谓词匹配的第一个元素的索引.相关问题:Rust数组有相同的JavaScript indexOf吗?
一个代码示例:
fn main() {
let mut vec = vec![1, 2, 3, 4];
println!("Before: {:?}", vec);
let removed = vec.iter()
.position(|&n| n > 2)
.map(|e| vec.remove(e))
.is_some();
println!("Did we remove anything? {}", removed);
println!("After: {:?}", vec);
}
Run Code Online (Sandbox Code Playgroud)
Luk*_*odt 10
有一个实验API,叫做Vec::remove_item().它仍然不稳定,因此它不适用于稳定的编译器.但它最终可能会变得稳定(跟踪问题).
使用这种方法,做你想要的事情很容易:
let removed = xs.remove_item(&some_x);
Run Code Online (Sandbox Code Playgroud)
如果您的数据已排序,请使用二分搜索进行O(log n)删除,这对于大输入可能会快得多。
match values.binary_search(value) {
Ok(removal_index) => values.remove(removal_index),
Err(_) => {} // value not contained.
}
Run Code Online (Sandbox Code Playgroud)
extract_if()上次的答案是新的吗?
似乎与凯的回答相似:
#![feature(extract_if)]
let mut numbers = vec![1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15];
numbers.extract_if(|x| *x % 2 == 0).collect::<Vec<_>>();
assert_eq!(numbers, vec![1, 3, 5, 9, 11, 13, 15]);
Run Code Online (Sandbox Code Playgroud)
https://doc.rust-lang.org/std/vec/struct.Vec.html#method.extract_if
| 归档时间: |
|
| 查看次数: |
19873 次 |
| 最近记录: |