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

Posted

技术标签:

【中文标题】C++ 合并和排序 2 个向量【英文标题】:C++ merge and sort 2 vectors 【发布时间】:2016-05-06 00:47:14 【问题描述】:

我可以在这方面提供一些帮助吗? 我有一个数组(向量的向量)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

【问题讨论】:

这是C++11还是更高版本,否则我相信你必须在vector&lt;vector&gt;&gt;&gt;&gt;序列之间放一个空格。 错误似乎很明显 - 在 ( 和行的 std::back_insert_iterator(... 之前缺少模板参数 - 没有模板参数。请参阅the docs,并注意示例。 【参考方案1】:
std::back_insert_iterator(TermStructure),

std::back_insert_iterator 是一个模板,类似于std::vector

你认为是这样的:

std::vector  a;

会编译吗?当然不是。您需要指定模板参数。它是什么? std::vector&lt;int&gt;,或std::vector&lt;char&gt;,等等……

检查您的代码后,我相信您希望这样:

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

我没有按照这里的所有数学计算,所以这可能正确也可能不正确,但至少现在可以编译了。

附:这是多余的:

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
;

其他初始化也是如此。

【讨论】:

@Fitzy 好吧,那么您的代码的其他部分存在一些错误。 您的问题是关于编译错误。但是,这里确实有一个运行时错误:“Temp[i][2] = Y;”那是缓冲区溢出。您可能的意思是“Temp[i][1]”。您应该学习如何使用调试器。 D'OH!是的。一旦修复它,它就会编译。唯一的问题是合并似乎没有奏效。向量“TermStructure”的所有元素 = 0。 嗯,这就是调试器的用途。祝你调试好你的代码,现在它已经编译并运行了。 输出大小应为 8x2。合并数据存在于目标向量中,但目标向量的大小似乎已增加。前 8 行(即“成熟度”等于,向量的一个维度应该是)用 0 填充。然后是 7 个预期的数据行,然后是另外 4 个 0,最后是第 8 个数据点。

以上是关于C++ 合并和排序 2 个向量的主要内容,如果未能解决你的问题,请参考以下文章

使用向量进行合并排序 (int) C++

合并排序相同的输出 C++

合并排序的合并操作不使用 C++ 向量

向量下标超出范围 C++ 合并排序

合并 K 个排序数组/向量的复杂性

C++ 按索引对向量进行排序