C++ 合并和排序 2 个向量
Posted
技术标签:
【中文标题】C++ 合并和排序 2 个向量【英文标题】:C++ merge and sort 2 vectors 【发布时间】:2016-05-06 00:47:14 【问题描述】:我可以在这方面提供一些帮助吗?
我有一个数组(向量的向量)InitTermStructure
。
如果连续的第一个元素之间的差异不是 0.5,我有一个执行插值的函数。
插值数据存储在向量“Temp”中。
然后我尝试合并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 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<vector>>
的>>
序列之间放一个空格。
错误似乎很明显 - 在 (
和行的 std::back_insert_iterator(...
之前缺少模板参数 - 没有模板参数。请参阅the docs,并注意示例。
【参考方案1】:
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),
我没有按照这里的所有数学计算,所以这可能正确也可能不正确,但至少现在可以编译了。
附:这是多余的:
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 个向量的主要内容,如果未能解决你的问题,请参考以下文章