V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  stein42  ›  全部回复第 4 页 / 共 4 页
回复总数  66
1  2  3  4  
Rust 的定位是和 C/C++ 一样运行效率高、没有垃圾回收,同时避免了 C/C++ 的很多错误,例如访问已释放的内存。

result 的 key 指向 sentence 的子字符串,所以 result 的生命周期应该不长于 sentence 。
否则先释放 sentence ,再访问 result ,就访问了已释放的内存,而这部分内存可能已经写入了其它数据。
C/C++ 这样做的话,可以通过编译,但运行时可能会出现莫名其妙的错误。
Rust 通过生命周期检查,可以避免这种错误。

'''
use std::collections::HashMap;

fn index_t_words<'a>(sentence: &'a String, bias: &str) -> HashMap<&'a str, usize> {
let mut result: HashMap<&str, usize> = HashMap::new();
for (idx, word) in sentence.split(' ').enumerate() {
if word.chars().nth(0).unwrap() == 't' {
result.insert(word, idx);
}
};
result
}

fn main() {
{
// 正确
let sentence: String = String::from("magic happens in the test statement");
let bias: String = String::from("spoiler");
let result = index_t_words(&sentence, &bias);
println!("{:?}", result);
}

{
// 错误,sentence 已经提前释放
let result = {
let sentence: String = String::from("magic happens in the test statement");
let bias: String = String::from("spoiler");
index_t_words(&sentence, &bias)
};
println!("{:?}", result);
}
}
'''
result 的 key 指向 sentence 的子字符串,所以 result 的生命周期不长于 sentence 。

result 的生命周期与 bias 无关,无脑加 'a 是有问题的,例如:

'''
use std::collections::HashMap;

fn index_t_words<'a>(sentence: &'a String, bias: &'a str) -> HashMap<&'a str, usize> {
let mut result: HashMap<&str, usize> = HashMap::new();
for (idx, word) in sentence.split(' ').enumerate() {
if word.chars().nth(0).unwrap() == 't' {
result.insert(word, idx);
}
};
result
}

fn main() {
let sentence: String = String::from("magic happens in the test statement");
let result = {
let bias: String = String::from("spoiler");
index_t_words(&sentence, &bias) // 错误!
};
println!("{:?}", result);
}
'''

正确的做法是:

'''
use std::collections::HashMap;

fn index_t_words<'a>(sentence: &'a String, bias: &str) -> HashMap<&'a str, usize> {
let mut result: HashMap<&str, usize> = HashMap::new();
for (idx, word) in sentence.split(' ').enumerate() {
if word.chars().nth(0).unwrap() == 't' {
result.insert(word, idx);
}
};
result
}

fn main() {
let sentence: String = String::from("magic happens in the test statement");
let result = {
let bias: String = String::from("spoiler");
index_t_words(&sentence, &bias)
};
println!("{:?}", result);
}
'''

只有一个参数时可以省略生命周期标注。

如果没有搞懂所有权、借用、生命周期这些概念,那还处于开始特别难的阶段。
2022-04-27 08:29:25 +08:00
回复了 cheitu 创建的主题 编程 3000 人民币预算有偿求助解决一个求极大值问题
可以试试牛顿法,用一阶二阶差分代替微分,一定条件下收敛。
或者每次迭代从一点及附近两点作一条二次曲线(抛物线),直接移动的极值点。
BFGS 是用一系列点的梯度得到类海森矩阵的逆,可以尝试退化到一元函数的情况。
另外黄金分割法每计算一个点区间缩小 0.618 倍,理论上效率比三分、四分法高。
2022-04-27 08:07:32 +08:00
回复了 MiketsuSmasher 创建的主题 知乎 新的钓鱼已经出现:开发 Terminal 程序就是走下坡路
jupyter notebook 可以输出 HTML ,所以格式化文本、数学公式、表格、图片、3d 、交互式等都不是问题。
mathematica 不光可以输出这些,输入也可以是数学公式、图片等。
2022-04-25 18:09:44 +08:00
回复了 cheitu 创建的主题 编程 3000 人民币预算有偿求助解决一个求极大值问题
BFGS 算法是求多元函数极值的。
牛顿法需要二阶导数。
这个可以直接用黄金分割法,也就是 0.618 法,不断缩小区间,收敛速度是指数级的。
2022-04-25 16:48:03 +08:00
回复了 herozzm 创建的主题 问与答 显卡在什么情况下才会温度飙升
nvidia-smi 命令可以查看 GPU 的状态,包括显存、计算力。
占用显存高不代表占用计算力,和内存和 CPU 占用一个道理。
1  2  3  4  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2722 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 14ms · UTC 09:24 · PVG 17:24 · LAX 01:24 · JFK 04:24
Developed with CodeLauncher
♥ Do have faith in what you're doing.