我想选择一个元素,然后从O(1)时间可变列表中删除。 在C ++中我可以做
std::list<Foo> lst;
std::list<Foo>::iterator it = //some choice
//And then, possibly in another function,
lst.erase(it);
我可以在斯卡拉相当于代码,或做我必须做的过滤器或差异?
编辑:为了澄清,我想单独选择和删除。 我想,这样以后可以快速访问,修改,可能已经删除标记的元素。 这将是巨大的,如果我能选择的一个后插入另一元素了。 这就是功能C ++迭代器给。
如果你想要做的O(1)去除,我认为你唯一的选择是寻找相应的内部链接的列表(有next
),并保持一个参考。
如果使用mutable.DoubleLinkedList
事情会变得容易一点:
val li = DoubleLinkedList(1,2,3,4,5,6)
val elem = li.next.next.next // O(< n) until you find what you want
elem.remove() // O(1)
li == DoubleLinkedList(1,2,3,5,6)
但即便如此,你不会有C ++小号可变迭代器接口的完整镜像。
我不知道有这将支持类似的东西,正确的斯卡拉列表。 可替换的建议是使用一个拉链在拉链的位置操作,其还提供了O(1)。
看看scala.collection.mutable.ArrayBuffer
例如(还有其他的,当然,但你并没有说什么收藏你有兴趣,所以我拿起一个):
val a = ArrayBuffer(1, 2, 3, 4)
a -= 3
这是相同的语义你的C ++版本(但它仍然为O(n),就像C ++版本)。