C ++合并和排序2个向量

时间:2016-05-06 00:47:15

标签: c++ sorting vector merge

我可以请你帮忙吗? 我有一个数组(向量矢量),InitTermStructure。 如果连续的第一个元素之间的差异不是0.5,我有一个执行插值的函数。 插值数据存储在矢量“Temp”中。

然后我尝试合并InitTermStructureTemp向量,按第一个元素排序。

所有插值计算都可以正常工作,但合并会调整目标矢量的大小,并添加零。我假设尺寸没有正确合并。有什么东西可以限制这个吗?应该是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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 4 0.095

1 个答案:

答案 0 :(得分: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}
};

也适用于其他初始化。