矢量是不可递增的错误

Vector is not incrementable error

本文关键字:错误      更新时间:2023-10-16

我正在用C++编写一个程序,实现Newton-Raphson方法等,我定义了一个多项式类:

#include <iostream>
#include <algorithm>
#include <utility>
#include <string>
#include <cmath>
#include <vector>
#include <set>
using namespace std;
class polynomial{
    using pair_dd = pair<double, double>;
public:
    polynomial(const vector<pair_dd>& v) : m_coeff(simplify(v)) {} // constructor
    polynomial(const polynomial& p) : m_coeff(p.m_coeff){} // copy constructor
    polynomial derivative() const{ // computes derivative
        vector<pair_dd> dcoeff;
        for_each(begin(m_coeff), end(m_coeff), [&](pair_dd p){
            dcoeff.emplace_back(pair_dd(p.first*p.second, p.second - 1));
        });
        return polynomial(dcoeff);
    }
    double apply(double x) const{ // applies poly to argument
        auto sum(0.0);
        for_each(begin(m_coeff), end(m_coeff), [&](pair_dd p){
            sum += p.first*pow(x, p.second);
        });
        return sum;
    }
    void write() const{ // prints polynomial
        // function just for testing
        for (const auto& term : m_coeff)
            cout << term.first << "x^" << term.second << " +";
        cout << endl;
    }
private:
    polynomial(); //forbid empty constructor
    vector<pair_dd> m_coeff;
    vector<pair_dd> simplify(const vector<pair_dd>& v) const{
        set<double> exp; // set of exponents
        for (const auto& term : v)
            exp.insert(term.second);
        vector<pair_dd> ret; // final simplified vector
        vector<pair_dd> temp; // temporary object
        for (const auto& power : exp){
            copy_if(begin(v), end(v), begin(temp), [&](const pair_dd p){
                return (p.second == power);
            });
            // combine terms
            auto sum(0.0);
            for (auto& p : temp)
                sum += p.first;
            ret.push_back(pair_dd(sum, power));
            temp.clear();
        }
        return ret;
    }
};

int main(){
    vector<pair<double, double>> vec;
    vec.push_back(pair<double, double>(5,1)); // 5x
    vec.push_back(pair<double, double>(10, 1)); // 10x
    vec.push_back(pair<double, double>(3, 2)); // 3x^2
    polynomial poly(vec);
    // should write 15x + 3x^2
    poly.write();
    return 0;
}

我遇到的问题是simplify函数,它在运行时在copy_if的位置出现错误。据说

矢量温度不可增加

在Visual Studio中。我的算法的工作方式是将所有具有相同x幂的项收集在一个集合中(因为我们只想要唯一的元素)。随后,我迭代指数集,使用成对向量上的copy_if将具有相同指数的所有项分组在一起,然后将其组合并放入最终向量中。

我已经尝试了保留和调整临时向量的大小。

copy_if不会分配内存,它假设temp已经达到大小,但事实并非如此。您可以使用<iterator>中的std::back_inserter

copy_if(begin(v), end(v), back_inserter(temp), [&](const pair_dd p){
    return (p.second == power);
});

您正试图复制到一个空向量中,您需要首先调整其大小,或者使用一个根据需要调整大小的插入器:

copy_if(begin(v), end(v), back_inserter(temp), [&](const pair_dd p){
            return (p.second == power);
        });