Могу я, пожалуйста, немного помочь в этом. У меня есть массив (вектор векторов), 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
Является ли это C++ 11 или более поздней версией, потому что в противном случае я считаю, что вы должны поместить пробел между '' '' '' порядком 'vector>'. –
Sam
Ошибка кажется довольно ясной: отсутствующий аргумент шаблона перед '(', а строка 'std :: back_insert_iterator (...' - no template argument. См. [Docs] (http://en.cppreference.com/w/cpp/iterator/back_insert_iterator), и обратите внимание на пример. –