【发布时间】:2020-06-02 01:07:08
【问题描述】:
在 JavaScript 中我会这样做:
function move(arr, old_index, new_index) {
while (old_index < 0) {
old_index += arr.length;
}
while (new_index < 0) {
new_index += arr.length;
}
if (new_index >= arr.length) {
var k = new_index - arr.length;
while ((k--) + 1) {
arr.push(undefined);
}
}
arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
return arr;
}
如何在 Rust 中完成同样的事情?
我不想使用insert 和remove,因为我的向量是std::vec::Vec<std::string::String>,我想将它们从字面上移到向量中的不同位置,而不是删除它们然后插入一个副本。
我不想交换 2 个元素。我想将元素的索引更改为任意其他索引,就像一个人切到队列中的任意其他位置一样。
【问题讨论】:
-
分享您的研究对每个人都有帮助。告诉我们您尝试了什么以及为什么它不能满足您的需求。这表明您已经花时间尝试帮助自己,它使我们免于重复明显的答案,最重要的是它可以帮助您获得更具体和相关的答案。另见:How to Ask
-
@GirkovArpa:元素存储在向量中的特定内存位置,向量是非常低的特征集合;索引是从连续分配的内存开始的特定偏移量。如果不将元素移动到新的内存位置,则无法更改元素的索引。充其量您可以使向量存储指向在其他地方分配的元素的指针,并交换指针(它仍然移动内存,但不是整个元素)。你在 JavaScript 中所做的仍然是移动引用,它并没有神奇地改变未移动元素的索引。
-
Strings 已经是堆分配的并且移动起来很便宜。无需使用&String添加间接级别。 -
Rust 没有像 JavaScript 那样的
undefined。你不能有一个带有“洞”的Vec。也许Should I store unordered values from a series with large holes in a sparse Vec or HashMap in Rust? 会回答你的问题。你可能只想要一个HashMap<SomeNumberType, T>。