2010-12-19 9 views
8

Ich habe Probleme beim Übersetzen C++ Datenstrukturen zu Scala. Scala ist wirklich anders als C++, aber ich mag eine Menge davon. Ich habe folgendes Codefragment in C++:Fragen zu Scala von einem C++ - Programmierer (Structs und STL)

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; 

I nun die Liste in einer while-Schleife mit Daten füllen

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

ich versuchte, eine einfache Klasse in Scala zu schaffen, die Daten zu halten.

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

Aber das funktioniert nicht, da Punkt nicht initialisiert ist. Gibt es einen Weg dahin? Ich möchte nur die Variable definieren, aber nicht initialisieren.

Eine andere schnelle Sache. Ich suche nach einem Äquivalent zu stl :: lower_bound.

Findet die richtige Position, um ein Element in einen sortierten Container einzufügen, um die Reihenfolge beizubehalten.

Vielen Dank für eine Scala Anfänger

helfen
+0

Ich glaube nicht, dass Sie ein direktes Äquivalent von 'std :: lower_bound finden werden '. Für was denkst du, dass du es brauchst? –

+0

'Seq.IndexWhere 'könnte eine Möglichkeit sein. – Debilski

+0

Ich habe eine Liste val list = Liste (1.0, 2.0, 3.0, 4.0), die Intervalle darstellen. Ich habe jetzt zum Beispiel einen Punkt 2.5 und muss wissen in welchem ​​Intervall es liegt (zwischen 2.0 und 3.0). Danke für den Index, wo ich es ausprobieren werde. – Radfahrer

Antwort

3

Ich habe gerade die Antwort auf die intialistion:

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

Puh Scala viel syntx muss zu :-) gewöhnen

Jedermann haben eine Lösung für das untere_bound Äquivalent?

3

Es ist schwer, effektiv zu übersetzen, wie Sie eine Menge von Unbekannten hinter Pseudo-Code versteckt verlassen haben, aber ich würde etwas in diese Richtung befürwortet:

// 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)) 
} 

Wenn Sie Ihren Beispielcode ein konkretisieren kann etwas ausführlicher, ich werde eine bessere Übersetzung geben können.

+0

das sieht interessant aus (ich bin noch neu in der funktionalen Programmierung).Hier ist der vollständige C++ Code: http://paste.pocoo.org/show/307014/. Die interessanten Teile sind Formularzeile 224-251 – Radfahrer

4

Warum möchten Sie es nicht initialisieren? Für Effizienz? Ich befürchte, dass die JVM dich nicht davon abhält, zufälligen Müll in deinen Variablen zu haben, basierend auf dem, was ursprünglich dort war. Da Sie es sowieso initialisieren müssen, warum geben Sie nicht an, was Ihr "nicht initialisierter" Wert ist?

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

(Sie könnten Double.NaN verwenden und prüfen, ob point.isNaN, wenn Sie später sehen müssen, ob der Wert initialisiert wurde oder nicht.)

Sie _ als Standard-Initialisierung verwenden könnte, aber wenn Sie es verwenden, im generischen Code:

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

dann verdunkeln Sie nur, was der Wert wirklich eingestellt wird. (Oder Sie kündigen an: "Es ist mir wirklich egal, was hier läuft, es könnte alles Mögliche sein" - was nützlich sein könnte.)

+0

Naja meistens aus Gewohnheit :-) Danke für diese Optionen. Ich mag das NaN mit erlaubt zu überprüfen, ob es initialisiert ist – Radfahrer