Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何惯用地迭代数组的一半并修改另一半的结构?_Rust_Idioms - Fatal编程技术网

Rust 如何惯用地迭代数组的一半并修改另一半的结构?

Rust 如何惯用地迭代数组的一半并修改另一半的结构?,rust,idioms,Rust,Idioms,迭代(读取)向量的前半部分并根据前半部分更改向量的后半部分的结构的惯用方法是什么?这是非常抽象的,但有些算法可以归结为这个问题。我想在锈中写这个简化的C++例子:< /p> for(变量i=0;i

迭代(读取)向量的前半部分并根据前半部分更改向量的后半部分的结构的惯用方法是什么?这是非常抽象的,但有些算法可以归结为这个问题。我想在锈中写这个简化的C++例子:< /p>
for(变量i=0;i
这个通用问题的惯用解决方案对于Rust和C是一样的,因为没有允许简化的约束

我们需要使用索引,因为向量重新分配将使迭代器包含的引用无效。我们需要在每个周期将索引与向量的当前长度进行比较,因为长度可能会改变。因此,惯用的解决方案如下所示:

let mut i = 0;
while i < v.len() {
    let mut j = i + 1;
    while j < v.len() {
        if f(v[i], v[j]) {
            v.splice(j, 1);
        } else {
            j += 1;
        }
    }
    i += 1;
}
设mut i=0;
而我


虽然这段代码涵盖了一般情况,但很少有用。它不捕捉细节,这些细节通常是手头的问题固有的。反过来,编译器无法在编译时捕获任何错误。我不建议在不考虑其他方法的情况下编写这样的内容。

您是否要求使用与示例相同的惯用方法?除此之外,你似乎没有提供一个明确的问题。顺便说一句,我建议你以后不要发表无关的评论。我想阅读数组的一部分,同时从结构上修改数组的另一部分。因此,在任何给定时刻,数组的0..k部分保持不变,但k..len可以任意重建(例如以随机方式)。我不能给出一个清晰的现实例子。但我有一种直觉,这种问题可能会引起。让我们尽可能地泛化。最重要的是,这个没有借阅检查器的问题在C语言中有一个清晰的解决方案。问题是,在不理解它对问题的含义的情况下,不应该使它过于泛化。特别是,是否希望能够在向量中添加和删除元素?这使问题变得更加困难。如果你把它缩小到一个特定的问题,我们可能会对你更有帮助。你是对的,这个问题不清楚,也没有经过深思熟虑@雷德费了点劲回答这个问题。我认为在这个问题的范围内,只回答这个简单的问题是公平的。谢谢你的回答和评论。我会试着提出一个更详细的问题。顺便说一句,我的意思是完全重建阵列的第二部分,可能是添加到阵列的第二部分。我认为随机接受答案不是一个好主意,@red75prime在回答你时犯了一个错误。不清楚的问题不应该是答案。如果你把你的问题说得更清楚一些,这会更好,因为这个问题在SO中没有用处,应该尽量不清楚。这不是真正的习惯用语。至少第一个
while
循环可以被一个范围内的
for
循环所取代:@PeterHall,对于这个问题的特定实例,范围是合适的,但它需要假设外部循环不访问
v[i]