我对 Rust 很陌生,并且仍然对生命周期说明符的概念有疑问。
我有一个Vec
(或任何其他集合)参考文献。现在我想用对新创建的局部变量的另一个引用替换特定引用。现在的问题是,局部新变量的生命周期比向量短,这会使引用无效。
尝试执行我想要的操作但抛出编译时错误的示例代码:
fn main() {
let values = ["one".to_string(), "lorem".to_string(), "three".to_string()];
let borrowed_values = vec![&values[0], &values[1], &values[2]];
println!("{:?}", do_the_impossible(borrowed_values));
}
fn do_the_impossible(mut data: Vec<&String>) -> Vec<&String> {
let replacement = "two".to_string();
data[1] = &replacement;
return data;
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是:如何创建一个与向量具有相同生命周期的新变量?
我想使用引用,因为克隆对象会非常昂贵。
我最初的想法是使用生命周期说明符,它表明局部变量应该与向量一样长。但我找不到语法上正确的方法来做到这一点。是否可以指定局部变量的生命周期?
如果没有,是否有其他方法可以避免克隆载体的元素?我最后的手段是使用Rc
指针。
提前致谢!
嗨,我正在尝试解决编程问题,但遇到以下问题:
假设您有多个数字列表。全部按降序排列。您现在必须从每个列表中取一个数字来获得最大可能的总和。
到目前为止很容易,要解决这个问题,您只需取每个列表的第一个数字即可。
但是现在,我需要第二大和,同时仍然使用每个列表中的一个数字。为了实现这一点,我将采用每个列表中的第一个元素,但对于第一个和第二个数字之间差异最小的列表,将使用第二个数字。
这还是很可行的。
但是我需要一个 Iterator 对每个可能的总和使用按降序排序的每个列表的一个数字。
出于性能原因,不可能只计算每个总和然后对其进行排序。该算法必须已经按降序提供总和。如果总和有多种组合,则必须多次返回总和。
Iterator 应该是惰性的(仅在需要时计算下一个总和)。
列表已经是惰性的,这意味着您应该需要尽可能少的值来计算拟合总和。
对于列表:
List 1: [5, 2, 1]
List 2: [10, 2]
List 3: [6, 1]
Run Code Online (Sandbox Code Playgroud)
然后迭代器应该返回:
[5, 10, 6] = 21
[2, 10, 6] = 18
[1, 10, 6] = 17
[5, 10, 1] = 16
[5, 2, 6] = 13
[2, 10, 1] = 13
[1, 10, 1] = 12
[2, 2, 6] = 10
[1, 2, 6] = 9
[5, 2, 1] = …
Run Code Online (Sandbox Code Playgroud) 我是 EC 加密的新手,并且遇到了一些困难。我正在使用 Java 8 和 BouncyCatle 提供程序。我现在的问题是:当我使用以下代码生成 EC-KeyPair 时:
ECGenParameterSpec spec = new ECGenParameterSpec("secp521r1");
KeyPairGenerator kpg = KeyPairGenerator.getInstance("ECDH", BouncyCastleProvider.PROVIDER_NAME);
kpg.initialize(spec, new SecureRandom());
return kpg.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)
并尝试获取公钥的字节数组并将其发送给另一个人,编码后的密钥长度为 158 字节,采用 X.509 格式。但我期望 X9.62 格式和 65 到 66 字节之间的密钥大小。为什么公钥这么大以及如何使用预期的密钥大小对其进行编码?(我预计密钥大小是因为我预计密钥长度为 521 位)
algorithm ×1
bouncycastle ×1
cryptography ×1
ecdsa ×1
iterator ×1
java ×1
lifetime ×1
list ×1
math ×1
rust ×1