sherry_gong 2018-04-15 13:12 采纳率: 50%
浏览 1579
已结题

如何将循环中的局部变量的引用赋值给循环外的vector

急!!!!C++ 新手,在写作业时遇到如下问题,希望大神可以帮忙看看,谢谢了!!!

  • vector< pair > pillarSmiles;
    vector kmin, kmax;
    vector< pair > marks;
    ArbitrageFreeInterpolator af;

    int a = 0;
    while(!fin.eof()) {
    double t;
    double atmvol;
    double ms25;
    double rr25;
    double ms10;
    double rr10;
    if (fin >> t >> atmvol >> ms25 >> rr25 >> ms10 >> rr10) {
    cout << t << "\t" << atmvol << "\t" << ms25 << "\t" << rr25 << "\t" << ms10 << "\t" << rr10 << std::endl;
    marks = input2Marks(spot, rd, rf, t, atmvol, ms25, rr25, ms10, rr10);
    af = ArbitrageFreeInterpolator(t, marks, spot, mu);
    pillarSmiles.push_back( pair(t, af) );
    std::cout<< "pillarSmiles[" << a <<"].second.Vol(1.3)= "< kmin.push_back(marks.front().first); // for plotting the charts only
    kmax.push_back(marks.back().first);
    }
    a++;
    }
    ImpliedVol iv(pillarSmiles);
    ImpliedVol,Smile都是自定义的类,AbitrageFreeInterpolator是Smile的子类,声明如下:
    class ArbitrageFreeInterpolator : public Smile
    {
    public:
    ArbitrageFreeInterpolator();
    ArbitrageFreeInterpolator(double _t, const vector& _marks, double _S, double _mu);
    virtual double Vol(double strike) const;
    private:
    vector< pair > marks; //M (k, sigma) input pairs;
    double S; // Spot price;
    double mu; // drift of spot;
    double t; //time to maturity(in unit of year);
    vector< pair > outputmarks; // N (k, c)pairs;
    vector y2; // second derivatives;
    };
    Input文件内容如下:
    1.25805 0.0100 0.0030
    0.02 0.1550 0.0016 -0.0065 0.0050 -0.0111
    0.04 0.1395 0.0016 -0.0110 0.0050 -0.0187
    0.06 0.1304 0.0021 -0.0143 0.0067 -0.0248
    ......
    然后我发现pillarSmile中存储的都是最后一次af的值,也就是每次重新给af赋值时,都会改变pillarSmile中以前输入的值,另外我也尝试过在循环外建一个AbitrageFreeInterpolator的vector,然后每次将循环内新定义的AbitrageFreeInterpolator赋值给这个vector,
    结果会报错:Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)
    想知道各位有什么好的解决办法吗?
    更新,采用一楼的建议,循环中改成了: ArbitrageFreeInterpolator* af = new ArbitrageFreeInterpolator(t, marks, spot, mu); pillarSmiles.push_back( pair(t, *af) ); delete af; cout出来的结果就不一样了,但是出现了一个新的问题,就是每次到pillaSmile最后几组的时候,出来的结果总是很大的异常值,有时候会中断,提示Thread 1:EXC_BAD_ACCESS(code=1,address=0x70) , 我查了下好像是访问已释放信息导致的,不太懂,想问下有什么解决的办法?

  • 写回答

2条回答

  • zhou-kang 2018-04-15 13:50
    关注

    请在for循环中用new AbitrageFreeInterpolator,然后将结果添加到链表中。
    出现问题的原因是,ArbitrageFreeInterpolator af是在循环外定义的变量,添加到链表中的是这个变量af,循环n次,就是添加这个变量af到链表中n次,每次都是同一个变量,那链表中肯定是n个相同的值,且都是最后一次修改的值。

    评论

报告相同问题?

悬赏问题

  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码