来自C ++程序员的Scala问题(结构和stl)

时间:2010-12-19 15:19:18

标签: c++ scala

我在将C ++数据结构转换为Scala时遇到问题。 Scala与C ++完全不同,但我喜欢它。 我在C ++中有以下代码片段:

struct Output
{
    double point;
    double solution[6];
};

struct Coeff
{
    double rcont1[6];
    double rcont2[6];
    double rcont3[6];
    double rcont4[6];
    double rcont5[6];
    double rcont6[6];
};
std::list<Output> output;
std::list<Coeff> coeff;

我现在用数据

填充while循环列表
while(n<nmax) {
    if step successfull
         Output out;
         out.point = some values;
         out.solution[0] = some value;
         output.push_back(out);
}

我尝试在Scala中创建一个简单的类来保存数据。

class Output
{
    var point: Double
    var solution: Array[Double] = new Array(6)
}

但是由于点没有初始化,所以这种方式不起作用。有没有解决的办法?我只想定义变量但不要初始化它。

另一个快速的事情。我正在寻找相当于stl :: lower_bound。

找到在排序容器中插入元素以维持订单的正确位置。

感谢您帮助Scala初学者

3 个答案:

答案 0 :(得分:4)

为什么不想初始化它?为了效率?我担心JVM不会让你根据最初的变量随机丢弃变量。因此,无论如何你必须初始化它,为什么不指定你的“未初始化”值是什么?

class Output {
  var point = 0.0
  var solution = new Array[Double](6)
}

(如果您稍后需要查看该值是否已初始化,则可以使用Double.NaN并检查point.isNaN。)

您可以使用_作为默认初始化,但除非您在通用代码中使用它:

class Holder[T] {
  var held: T = _
}

然后你只是模糊了真正设定的价值。 (或者你宣布“我真的不在乎这里发生了什么,它可能是任何东西” - 这可能是有用的。)

答案 1 :(得分:3)

我刚刚找到了初学者的答案:

class Output
{
    var point: Double = _
    var solution: Array[Double] = Array(6)
}

Puh Scala有很多习惯用于: - )

任何人都有针对lower_bound等效项的解决方案吗?

答案 2 :(得分:3)

很难有效地翻译,因为你在伪代码背后隐藏了许多未知数,但我提倡这些方面的东西:

// type alias
type Coeff = Seq[Seq[Double]]

// parameters passed to a case class become member fields
case class Output (point: Double, solution: Seq[Double])

val outputs = (0 to nmax) map { n =>
    Output(generatePoint(n), generateSolution(n))
}

如果你能更充分地充实你的示例代码,我将能够提供更好的翻译。