2016-05-06 3 views
-3

Могу я, пожалуйста, немного помочь в этом. У меня есть массив (вектор векторов), InitTermStructure. У меня есть функция, которая выполняет интерполяцию, если разница между последовательными первыми элементами не равна 0,5. Интерполированные данные хранятся в векторе «Temp».C++ слияние и сортировка 2 вектора

Затем я пытаюсь объединить векторы InitTermStructure и Temp, отсортированные по первым элементам.

Все вычисления интерполяции работают нормально, однако слияние изменяет размер целевого вектора и добавляет нули. Я предполагаю, что размеры не сливаются должным образом. Есть ли что-то, что может ограничить это? Он должен быть 6x2, объединенным с 2x2, образующим 8x2.

Код:

#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; 
} 

Выход: 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

Является ли это C++ 11 или более поздней версией, потому что в противном случае я считаю, что вы должны поместить пробел между '' '' '' порядком 'vector >'. – Sam

+0

Ошибка кажется довольно ясной: отсутствующий аргумент шаблона перед '(', а строка 'std :: back_insert_iterator (...' - no template argument. См. [Docs] (http://en.cppreference.com/w/cpp/iterator/back_insert_iterator), и обратите внимание на пример. –

ответ

2
std::back_insert_iterator(TermStructure), 

std::back_insert_iterator представляет собой шаблон, как std::vector.

Как вы думаете, что-то вроде:

std::vector a; 

компилируется? Конечно нет. Вам нужно указать параметры шаблона. Что это? std::vector<int> или std::vector<char> и т.д ...

После изучения кода, я полагаю, вы хотите, чтобы это было:

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

Я не следовал всю математику здесь, так что это может быть или не быть но, по крайней мере, он компилируется.

P.S. Это является избыточным:

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} 
}; 

Вы инициализируете вектор фиксированного размера. Затем вы сразу же заменяете содержимое вектора. Этого вполне достаточно:

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} 
}; 

То же самое для другой инициализации.

+0

Это дает ошибку времени выполнения. – Fitzy

+3

@Fitzy Хорошо, тогда есть некоторая ошибка с другими частями вашего кода. –

+0

Ваш вопрос касался ошибки компиляции. Но у вас есть ошибка времени выполнения: «Temp [i] [2] = Y;» Это переполнение буфера. Вероятно, вы имели в виду «Temp [i] [1]». Вы должны научиться использовать отладчик. –

Смежные вопросы