当前位置: 首页 > 知识库问答 >
问题:

如何在Vec或切片中设置范围?

叶国兴
2023-03-14

我的最终目标是打乱矩阵的行(我使用代数)。

为了解决这个问题,我需要设置数组的可变范围(片)。假设我有一个数组(假设它是一个3x3矩阵):

let mut scores = [7, 8, 9, 10, 11, 12, 13, 14, 15];

我提取了一行,如下所示:

let r = &scores[..].chunks(3).collect::<Vec<_>>()[1];

现在,对于knuth shuffle,我需要用另一行交换这个。我需要做的是:

scores.chunks_mut(3)[0] = r;

但是,这样做失败了:

cannot index a value of type `core::slice::ChunksMut<'_, _>`

例子:http://is.gd/ULkN6j

共有2个答案

牟飞沉
2023-03-14

你想写的代码永远无法工作。您有一个数组,试图同时读取和写入该数组。这将导致您有重复的数据:

[1, 2, 3, 4]
// Copy last two to first two
[3, 4, 3, 4]
// Copy first two to last two
[3, 4, 3, 4]

锈会阻止你因为这个原因对同一事物有可变和不可变的引用。

无法索引类型为core::slice::ChunksMut的值

chunks\u mut返回一个迭代器。迭代器保证要做的唯一一件事就是返回“下一件事”。您无法对其编制索引,因为它并非在连续内存中全部可用。

要移动数据,您需要一个临时的地方来存储数据。一种方法是复制数组:

let scores = [7, 8, 9, 10, 11, 12, 13, 14, 15];
let mut new_scores = scores;

for (old, new) in scores[0..3].iter().zip(new_scores[6..9].iter_mut()) {
    *new = *old;
}

for (old, new) in scores[3..6].iter().zip(new_scores[0..3].iter_mut()) {
    *new = *old;
}

for (old, new) in scores[6..9].iter().zip(new_scores[3..6].iter_mut()) {
    *new = *old;
}

然后是遵循这些现有问题中的一个,从一个复制到另一个。

傅经业
2023-03-14

我最终做了一个循环和一个元素一个元素的交换,这对我来说似乎是一个更干净的实现:

    fn swap_row<T>(matrix: &mut [T], row_src: usize, row_dest: usize, cols: usize){
      for c in 0..cols {
        matrix.swap(cols * row_src + c, cols * row_dest + c);
      }
    }
 类似资料:
  • 我需要将ViewPager放置在一个片段内部,但我有两个片段,片段1是我的菜单,片段2我想用作ViewPagerIndicator。 但一个碎片不能再有另一个碎片...我该怎么做呢?

  • 问题内容: 在玩过Go HTML模板后,我发现所有用于遍历模板中对象的示例都是将切片的结构传递给模板,有点像此示例中所示: 其中“主要”模板为: 这有效,但是如果我仅使用.Name属性,则我不明白如何在每个ID旁边显示每个ID。我会发现在显示时将每个用户视为一个对象来对其属性进行分组会更合乎逻辑。 因此,我的问题是: 如果我想将结构片段传递给模板怎么办? 使它起作用的语法是什么?我尚未在官方htm

  • 我需要这样的东西: 当然,我认为只有内置数字类型的向量才能传递给函数。 编译器告诉我,我需要为Vec提供FromIterator的trait trait

  • 本文向大家介绍如何在逆时针方向设置JavaFX PieChart的切片?,包括了如何在逆时针方向设置JavaFX PieChart的切片?的使用技巧和注意事项,需要的朋友参考一下 改变切片的方向 PieChart的第一个切片开始的角度称为开始角度,您可以使用setStartAngle()方法设置此值(默认为0)。 饼图类提供被称为属性(布尔值)顺时针指定当前饼图的切片是否在从开始角度沿顺时针方向(

  • 问题内容: 在Go中清除切片的适当方法是什么? 这是我在go论坛中找到的内容: 这样对吗? 为了澄清起见,清除了缓冲区,以便可以重用它。 一个示例是bytes包中的Buffer.Truncate函数。 请注意,Reset只是调用Truncate(0)。因此看来,在这种情况下,第70行将评估:b.buf = b.buf [0:0] http://golang.org/src/pkg/bytes/bu

  • 创建大小为的隐式数组,并创建一个隐式数组的浅副本,指向数组中的前7个元素。 考虑 创建不指向任何隐式数组的零长度切片。 创建长度为2的新隐式数组,并附加值和。slice()指向新的隐式数组,其中