2016-05-06 14 views
-3

Kann ich bitte etwas Hilfe dabei haben. Ich habe ein Array (Vektor von Vektoren), InitTermStructure. Ich habe eine Funktion, die Interpolation durchführt, wenn die Differenz zwischen aufeinanderfolgenden ersten Elementen nicht 0,5 ist. Die interpolierten Daten werden im Vektor "Temp" gespeichert.C++ merge und sortiere 2 Vektoren

Ich versuche dann die InitTermStructure und Temp Vektoren, nach den ersten Elementen sortiert, zusammenzuführen.

Alle Interpolationsberechnungen funktionieren einwandfrei, die Zusammenführung ändert jedoch die Größe des Zielvektors und fügt Nullen hinzu. Ich gehe davon aus, dass die Dimensionen nicht richtig zusammengeführt werden. Gibt es etwas, das das einschränken kann? Es sollte ein 6x2 sein, das mit einem 2x2 zu einer 8x2 verschmolzen wird.

Code:

#include <iostream> 
#include <algorithm> // merge function 
#include <vector> 
#include <iterator> 
using namespace std; 

double Linear_Extrapolation(double X, double x1, double y1, double x2, double y2); 

double Linear_Extrapolation(double X, double x1, double y1, double x2, double y2) 
{ 
    return(y1 + ((X - x1)/(x2 - x1)) * (y2 - y1)); 
} 

int main() { 

const int Mat = 6; 

    vector<vector<double>> InitTermStructure((Mat), vector<double>(2)); 

InitTermStructure = { 
    { 0.5 , 0.05 }, 
    { 1.0 , 0.06 }, 
    { 1.5 , 0.07 }, 
    { 2.0 , 0.075 }, 
    { 3.0 , 0.085 }, 
    { 4.0 , 0.095} 
    }; 

double dt = InitTermStructure[0][0]; 
int Maturities; 
int IrregIntervalCount=0; 
int count = 0; 
double X, Y; 

for (int i = 1; i < Mat; i++) 
{ 
    if (InitTermStructure[i][0] - InitTermStructure[i-1][0] != dt) 
    { 
     IrregIntervalCount = IrregIntervalCount + 1; 

    } 
    } 


Maturities = IrregIntervalCount + Mat; 

vector<vector<double>> Temp((Mat), vector<double>(2)); 
vector<vector<double>> TermStructure((Maturities), vector<double>(2)); 

for (int i = 1; i < Mat; i++) 
{ 
    if (InitTermStructure[i][0] - InitTermStructure[i-1][0] != dt) 
    { 
     X = InitTermStructure[i-1][0] + dt; 
     count = count +1; 

     Y = Linear_Extrapolation(X, InitTermStructure[i-1][0], InitTermStructure[i-1][1], InitTermStructure[i][0], InitTermStructure[i][1]);  
     Temp[count - 1][0] = X; 
     Temp[count - 1][1] = Y; 
    } 
} 

    std::merge(InitTermStructure.begin(), InitTermStructure.end(), Temp.begin(), Temp.end(), std::back_insert_iterator<vector<vector<double>>>(TermStructure), [](const auto &a, const auto &b) 
       { 
        return a[0] < b[0]; 
       } 
       ); 

for (int i = 0; i <= Maturities*2.5; i++) // !!!! Should be (int i = 0; i <= Maturities; i++) Maturities multiplied by 2.5 to show incorrect output. 
    { 
    cout << TermStructure[i][0] << " " << TermStructure[i][1] << endl; 
    } 
    return 0; 
} 

Output: 0,5 0,05 1 0,06 1,5 0,07 2 0.075 2,5 0,08 3 0,085 3,5 0,09 4 0,095

+0

Ist das C++ 11 oder später, weil ich sonst glaube, dass Sie ein Leerzeichen zwischen die '>>' Sequenz von 'Vektor >' setzen müssen. – Sam

+0

Der Fehler scheint ziemlich klar zu sein - fehlendes Template-Argument vor '(', und die Zeile 'std :: back_insert_iterator (...' - kein Template-Argument. Siehe [die Dokumentation] (http://en.cppreference.com/w/cpp/iterator/back_insert_iterator) und notieren Sie das Beispiel –

Antwort

2
std::back_insert_iterator(TermStructure), 

std::back_insert_iterator ist eine Vorlage, wie std::vector.

Glauben Sie, dass so etwas wie:

std::vector a; 

kompilieren würde? Natürlich nicht. Sie müssen die Vorlagenparameter angeben. Was ist es? std::vector<int> oder std::vector<char>, etc ...

Nachdem Sie den Code untersuchen, ich glaube, Sie dies sein wollen:

std::back_insert_iterator<vector<vector<double>>>(TermStructure), 

Ich habe hier alle die Mathematik nicht gefolgt, so dass dies sein kann oder nicht richtig, aber zumindest kompiliert es jetzt.

P.S. Dies ist redundant:

int Mat = 6; 

vector<vector<double>> InitTermStructure((Mat), vector<double>(2)); 

InitTermStructure = { 
    { 0.5 , 0.05 }, 
    { 1.0 , 0.06 }, 
    { 1.5 , 0.07 }, 
    { 2.0 , 0.075 }, 
    { 3.0 , 0.085 }, 
    { 4.0 , 0.095} 
}; 

Sie initialisieren einen Vektor fester Größe. Dann ersetzen Sie sofort den Inhalt des Vektors. Es ist vollkommen ausreichend, nur zu haben:

vector<vector<double>> InitTermStructure = { 
    { 0.5 , 0.05 }, 
    { 1.0 , 0.06 }, 
    { 1.5 , 0.07 }, 
    { 2.0 , 0.075 }, 
    { 3.0 , 0.085 }, 
    { 4.0 , 0.095} 
}; 

Dito für die andere Initialisierung auch.

+0

Es gibt einen Laufzeitfehler – Fitzy

+3

@Fitzy Gut, dann gibt es einen Fehler mit anderen Teilen Ihres Codes. –

+0

Bei Ihrer Frage ging es um einen Kompilierungsfehler. Aber Sie haben hier einen Laufzeitfehler: "Temp [i] [2] = Y;" Das ist ein Pufferüberlauf. Du hast wahrscheinlich "Temp [i] [1]" gemeint. Sie sollten lernen, einen Debugger zu verwenden. –