我想知道是否有一个地图的实现是:
简而言之,是否存在可以与Hash Maps进行性能比较的功能数据结构?
Java标准库是否具有功能更新的任何功能数据结构,如不可变集,列表等?
不可变数据结构的一个卖点是它们可以自动并行化.如果没有发生突变,则可以在线程之间传递对函数数据结构的引用而不进行任何锁定.
我开始考虑如何在c ++中实现功能数据结构.假设我们在数据结构的每个节点上都有引用计数.(功能数据结构共享数据结构的旧成员和更新成员之间的结构,因此节点不会唯一属于一个特定数据结构.)
问题是如果在不同的线程中更新引用计数,那么我们的数据结构就不再是线程安全的.将互斥锁附加到每个节点都很昂贵,并且无法使用不可变数据结构进行并发.
有没有办法使并发不可变数据结构在c ++(和其他非垃圾收集环境)中工作?
c++ concurrency functional-programming immutability data-structures
我发现了一个我可以理解的可变集的奇怪行为:
我有一个对象,我想添加到一个集合.该类的equals方法被覆盖.当我向set添加两个不同的对象时,它为equals方法产生相同的输出,我在contains方法的可变和不可变集之间得到了不同的行为.
这是代码片段:
class Test(text:String){
override def equals(obj:Any) = obj match {
case t: Test => if (t.text == this.text) true else false
case _ => false
}
override def toString = text
}
val mutableSet:scala.collection.mutable.Set[Test] = scala.collection.mutable.Set.empty
mutableSet += new Test("test")
println(mutableSet)
println(mutableSet.contains(new Test("test")))
val immutableSet:scala.collection.immutable.Set[Test] = scala.collection.immutable.Set.empty
immutableSet += new Test("test")
println(immutableSet)
println(immutableSet.contains(new Test("test")))
Run Code Online (Sandbox Code Playgroud)
这产生了输出:
Set(test)
false
Set(test)
true
Run Code Online (Sandbox Code Playgroud)
在我看来,contains的两个调用应该产生相同的输出(true).
任何人都可以帮助我理解这里的区别,或者这是scala不可变集实现中的错误吗?顺便说一句,我使用scala 2.8.1.final
谢谢.
我对修改元组成员有点困惑.以下不起作用:
>>> thing = (['a'],)
>>> thing[0] = ['b']
TypeError: 'tuple' object does not support item assignment
>>> thing
(['a'],)
Run Code Online (Sandbox Code Playgroud)
但这确实有效:
>>> thing[0][0] = 'b'
>>> thing
(['b'],)
Run Code Online (Sandbox Code Playgroud)
还有效:
>>> thing[0].append('c')
>>> thing
(['b', 'c'],)
Run Code Online (Sandbox Code Playgroud)
不起作用,并且有效(嗯?!):
>>> thing[0] += 'd'
TypeError: 'tuple' object does not support item assignment
>>> thing
(['b', 'c', 'd'],)
Run Code Online (Sandbox Code Playgroud)
看似与以前相同,但有效:
>>> e = thing[0]
>>> e += 'e'
>>> thing
(['b', 'c', 'd', 'e'],)
Run Code Online (Sandbox Code Playgroud)
那么,当你能够并且不能修改元组内的某些内容时,游戏的规则到底是什么?它似乎更像禁止使用赋值成员的赋值运算符,但最后两个案例让我感到困惑.
有没有办法从对象(数据框,矩阵,向量)中选择一个子集而无需复制所选数据?
我使用相当大的数据集,但从不更改它们.然而,为方便起见,我选择要操作的数据子集.每次制作一个大的子集的副本是非常低效的内存,但是正常的索引和subset(以及因此xapply()的函数族)都创建了所选数据的副本.所以我正在寻找可以解决这个问题的功能或数据结构.
一些可能符合我需求的方法,并希望在一些R包中实现:
xapply() 不创建子集的类似物.为什么在Rust中强制使用不变性,除非你指定mut?这是安全性的设计选择吗,您是否认为它在其他语言中应该如何自然?
我应该澄清一下,我还是Rust的新手.那么这是一种与该语言中的另一个功能相关的设计选择吗?
在检查Java BigDecimal类的源代码时,我很惊讶它没有被声明为final class:
类BigDecimal
Run Code Online (Sandbox Code Playgroud)public class BigDecimal extends Number implements Comparable<BigDecimal>不可变的,任意精度的带符号十进制数.
(来自Oracle Docs)
是否有特定原因或开发人员忘记添加该关键字?不将不可变类声明为final是不错的做法?
同样的情况也适用BigInteger,但不是String宣布为最终的.
在我上次的c#访谈中,
我被要求证明C#字符串的不变性,我知道c#字符串的不变性意味着什么,但是有可能通过代码证明c#字符串的不变性吗?请问我有一个示例代码片段吗?提前致谢