import qualified Data.Vector.Unboxed as VU
import qualified Data.Vector.Algorithms.Intro as VAlgo
argSort :: (Ord a, VU.Unbox a) => VU.Vector a -> VU.Vector Int
argSort xs = VU.map fst $ VU.create $ do
xsi <- VU.unsafeThaw $ VU.indexed xs
VAlgo.sortBy (comparing snd) xsi
return xsi
我的理由是unsafeThaw
在这里使用它是安全的,因为我只indexed
解冻xs
. 然而,后来我突然想到,元组的未装箱向量——就像这里的这些索引值对——实际上存储为两个未装箱的向量,一个用于索引,一个用于值。indexed
因此,实际上根本不会生成新的值向量,而只是将它与索引向量结合起来,这似乎是合理的。在这种情况下,ST
-modifyingxsi
可能会搞砸xs
。
经测试,这似乎并没有发生。我可以依靠这个,还是应该更好地使用thaw
?