我觉得set.seed(31)
while(TRUE)
{
A = floor(runif(100, 1,1e6))
B = c(1,floor(runif(300, 1,1e6)))
if (!any(c(A %in% B, B %in% A))){break}
}
x = floor(runif(1e5, 1,1e6))
Marat = function (A,B,x)
{
d <- rbind(data.frame(x=TRUE,y=A),data.frame(x=FALSE,y=B))
d <- d[order(d$y),]
return (d$x[findInterval(x,d$y)])
}
Remi = function (A,B,x)
{
Sol = rep(NA,length(x))
for (i in 1:length(x))
{
xi = x[i]
mA = max(A[A<=xi])
mB = max(B[B<=xi])
if (mA>mB) {Sol[i]=TRUE} else {Sol[i]=FALSE}
}
}
benchmark(s1 <- Marat(A,B,x), s2 <- Remi(A,B,x), order="elapsed")
test replications elapsed relative user.self sys.self user.child sys.child
1 s1 <- Marat(A, B, x) 100 1.003 NA 0.964 0.065 0 0
2 s2 <- Remi(A, B, x) 100 144.118 NA 130.320 14.867 0 0
可以使用(某种)rc::Weak
特征实现。我试图从弱指针借用一些共享内容,但这不会编译:
AsRef
我理解为什么:已升级的use std::rc::Weak;
struct Thing<T>(Weak<T>);
impl<T> Thing<T> {
fn as_ref(&self) -> Option<&T> {
self.0.upgrade().map(|rc| {
rc.as_ref()
})
}
// For clarity, without a confusing closure
fn unwrapped_as_ref(&self) -> &T {
self.0.upgrade().unwrap().as_ref()
}
}
无法在Rc
电话中存活。然而,在我看来它是完美的声音。使用as_ref
进行编译的可能魔术:
unsafe
所以:
impl<T> Thing<T> {
fn unwrapped_as_ref<'a>(&'a self) -> &'a T {
let rc = self.0.upgrade().unwrap();
unsafe {
std::mem::transmute(rc.as_ref())
}
}
}
是否有意义?答案 0 :(得分:3)
你不能借用弱引用,你就是不能。它很弱,不能保证底层对象存在(这就是upgrade()
返回Option
的原因)。即使你很幸运,当你通过弱引用(upgrade()
返回Some
)访问它时,值仍然存在,下一刻就可以释放它,只要{{{ 1}} d引用超出范围。
为了获得对底层值的引用,您需要某些来保持它的存活(例如强引用),但这意味着您必须将它与引用一起返回。