为什么删除元素时,nim 中不保留序列的顺序?

pro*_*gia 2 sequence nim-lang

我正在尝试 nim 并在处理序列时与奇怪的行为作斗争。

如果我运行这段代码:

var
    hobbies = @["Coding", "Creating", "Sports"]

echo hobbies

hobbies.add("Nature")
echo hobbies

hobbies.del(0)
echo hobbies
Run Code Online (Sandbox Code Playgroud)

我期望这个输出,因为我认为它像队列一样工作:

@["Coding", "Creating", "Sports"]
@["Coding", "Creating", "Sports", "Nature"]
@["Creating", "Sports", "Nature"]
Run Code Online (Sandbox Code Playgroud)

但我得到了这个:

@["Coding", "Creating", "Sports"]
@["Coding", "Creating", "Sports", "Nature"]
@["Nature", "Creating", "Sports"]
Run Code Online (Sandbox Code Playgroud)

通过索引删除后.del(0)"Nature"切换到索引0。

难道不应该保留订单吗?

版本:

Nim Compiler Version 1.6.14 [Linux: amd64]
Compiled at 2023-06-29
Run Code Online (Sandbox Code Playgroud)

use*_*670 5

del操作将最后的项目与被删除的项目交换,然后弹出它。具有恒定的复杂性。

如果您想保留元素的顺序,那么您需要使用在项目被删除后将每个项目的索引移动 1 的delete操作。此操作的线性复杂度与序列的大小成正比。