矢量的第一个元素与奇怪的数据

时间:2015-02-27 21:43:32

标签: c++ vector

我会尽力解释我能解决的问题:

我有一类Polinomio(西班牙语的多项式)。它有一个Monomio(Monomial)类的向量。

在Polinomio我有这个方法:

void Polinomio::rellenarRandom() {
    Monomio mon;
    vector<Monomio> vec (getGrado() + 1, mon);

    for (int i = 0; i <= getGrado(); i++) {
        int random = MIN + (rand() % (int)(MAX - MIN + 1));
        Monomio mon (random, i);
        vec[i] = mon;
    }
    cout << vec[0] << endl;
    cout << vec[1] << endl;
    cout << vec[2] << endl;
    cout << vec[3] << endl;
    cout << vec[4] << endl;
    setMonomio(vec);
}

它用随机Monomials填充矢量vec,然后它将vetor“Monomio”(坏名字,我知道)设置为这个随机向量。

cout使这个输出(它变化,但是一个例子):

  • -11x ^ 0
  • -69x ^ 1
  • 28X ^ 2
  • -78x ^ 3
  • -53x ^ 4

setter非常简单:

void Polinomio::setMonomio(vector<Monomio> vec) {
    this->monomios = vec;
}

主要是我:

Polinomio pol (5); // Creates a Polinomial with grade 5
pol.rellenarRandom();
cout << "pol: " << pol << endl;

那个cout做了这个输出:

  

pol:3473744x ^ 0 + -69x ^ 1 + 28x ^ 2 + -78x ^ 3 + -53x ^ 4 + -9x ^ 5 +

我多次测试,试图检测错误,但似乎没有模式。第一个数字每次都不同,但从来都不是。

这不是&lt;&lt;的重载问题。在Polinomo类上,因为我还测试了对该元素的另一个访问,并且它“正确地”显示它(相同,即使它不是它应该的那样)。

问题必须出在设定者身上,但我无法弄清问题是什么。

感谢您的帮助!

编辑:(修改了setMonomio错误的setter名称

我又添加了一个测试,它让我疯狂。这就是我所做的:

  1. 我在设置之前修改了这个cout,看到给我带来问题的成员:

    cout&lt;&lt; “VEC:”; cout&lt;&lt; vec [0]&lt;&lt; ENDL;

    setMonomios(VEC);

  2. 在setMonomios中,我修改了setMonomios:

    void Polinomio :: setMonomios(vector vec){     cout&lt;&lt; “set:”&lt;&lt; vec [0]&lt;&lt; ENDL;     this-&gt; monomios = vec;     cout&lt;&lt; “postset:”&lt;&lt; this-&gt; monomios [0]&lt;&lt; ENDL; }

  3. 结果:

    • VEC:0x ^ 0
    • 设置:3670352x ^ 0
    • postset:3670352x ^ 0

    那么,当我打电话给setter时,勇气会以某种方式被修改?

    答案(编辑你已经要求):

    Tony Jiang:

    这样做了,结果是(只有第一个元素,才会产生问题): * VEC:0x ^ 0 *设置:3670352x ^ 0 * postset:3670352x ^ 0

    Wolfgang.Finkbeiner:

    &lt;&lt;运算符重载:

    inline ostream& operator<< (ostream& o, const Polinomio &a) {
        auto v = a.getMonomios();
        for (vector<Monomio>::iterator it = v.begin(); it != v.end(); ++it)
            o << *it << " + ";
        return o;
    }
    

    DOUGLAS O. MOEN

    getGrado总是返回相同的值。我不使用vector.size()的原因是因为在其他一些函数中我在初始化向量之前使用它,或者在修改它时使用它,所以如果我这样做会产生意想不到的结果。无论如何,经过测试,它没有任何问题。

    PaulMcKenzie

    我不知道你的复制语义究竟是什么意思,但无论如何,我会发布它:

    #include "Monomio.h"
    
    Monomio::Monomio() {
        coeficiente = 0;
        exponente = 0;
    }
    
    Monomio::Monomio(int coef) {
        coeficiente = coef;
        exponente = 0;
    }
    
    Monomio::Monomio(int coef, int exp) {
        coeficiente = coef;
        exponente = exp;
    }
    
    Monomio::Monomio(const Monomio& orig) {
    }
    
    Monomio::~Monomio() {
    }
    
    
    
    //Getters & Setters:
    int Monomio::getCoeficiente() const {
        return coeficiente;
    }
    
    int Monomio::getExponente() const {
        return exponente;
    }
    
    void Monomio::setCoeficiente(int c) {
        this->coeficiente = c;
    }
    
    void Monomio::setExponente(int e) {
        this->exponente = e;
    }
    

    R Sahu

    MCVE(可能不完全是Minimal,但它是一个小项目):

    除了Monomio(上面发布的)重播之外你可能需要:

    Polinomio班:

    #include "Polinomio.h"
    
    Polinomio::Polinomio() {
        setGrado(0);
        setMonomios(vector<Monomio> (0));
        srand (time(NULL));
    }
    
    Polinomio::Polinomio(const Polinomio& orig) {
        setGrado(orig.getGrado());
        setMonomios(orig.getMonomios());
        srand (time(NULL));
    }
    
    Polinomio::Polinomio(int grado) {
        setGrado(grado);
        cout << "grado:" << getGrado() << endl;
        Monomio mon;
        setMonomios(vector<Monomio> (getGrado() + 1, mon));
        srand (time(NULL));
    }
    
    Polinomio::~Polinomio() {
    }
    
    int Polinomio::getGrado() const {
        return this->grado;
    }
    
    vector<Monomio> Polinomio::getMonomios() const {
        return this->monomios;
    }
    
    void Polinomio::rellenarRandom() {
        Monomio mon;
        vector<Monomio> vec (getGrado() + 1, mon);
    
        for (int i = 0; i <= getGrado(); i++) {
    //        int random = MIN + (rand() % (int)(MAX - MIN + 1));
            int random = 1 +  i;
            Monomio mon (random, i);
            vec[i] = mon;
        }
    
        cout << "VEC :";
        cout << vec[0] << endl;
    
        setMonomios(vec);
        auto v = monomios;
    
        cout << "V: ";
        cout << v[0] << endl;
    }
    
    void Polinomio::rellenarRandom(int grado) {
    
    }
    
    void Polinomio::setGrado(int grado) {
        this->grado = grado;
    }
    
    void Polinomio::setMonomios(vector<Monomio> vec) {
        cout << "set: " << vec[0] << endl;
        this->monomios = vec;
        cout << "postset: " << this->monomios[0] << endl;
    }
    

    和Header文件(主要针对运营商,但如果你看到任何奇怪的东西请告诉我):

    #ifndef POLINOMIO_H
    #define POLINOMIO_H
    
    #include "Monomio.h"
    
    class Polinomio {
        int grado;
    public: vector<Monomio> monomios;
    public:
        Polinomio();
        Polinomio (int grado);
        Polinomio(const Polinomio& orig);
        virtual ~Polinomio();
        int getGrado () const;
        void setGrado (int grado);
        void rellenarRandom ();
        void rellenarRandom (int grado);
        vector<Monomio> getMonomios () const;
        void setMonomios (vector<Monomio> vec);
    private:
        const int MAX = 100;
        const int MIN = -100;
    };
    
    //Operators:
    
    inline ostream& operator<< (ostream& o, const Polinomio &a) {
        auto v = a.getMonomios();
        for (vector<Monomio>::iterator it = v.begin(); it != v.end(); ++it)
            o << *it << " + ";
        return o;
    }
    
    inline Polinomio operator+(const Polinomio &a, const Polinomio &b) {
    }
    
    inline Polinomio operator-(const Polinomio &a, const Polinomio &b) {
    }
    
    inline Polinomio operator*(const Polinomio &a, const Polinomio &b) {
    }
    
    
    #endif  /* POLINOMIO_H */
    
    
    
    #ifndef MONOMIO_H
    #define MONOMIO_H
    
    #include <cstdlib>
    #include <stdlib.h>
    #include <vector>
    #include <string>
    #include <iostream>
    #include <algorithm> 
    #include <iostream>
    #include <fstream>
    #include <cstring>
    #include <iomanip>
    
    using namespace std;
    
    class Monomio {
        int coeficiente;
        int exponente;
    
    public:
        Monomio();
        Monomio(int coef);
        Monomio(int coef, int exp);
        Monomio(const Monomio& orig);
        int getCoeficiente() const;
        int getExponente() const;
        void setExponente(int e);
        void setCoeficiente(int c);
        virtual ~Monomio();
    
    private:
    
    };
    
    //Operators:
    
    inline ostream& operator<< (ostream& o, const Monomio &a) {
        o << a.getCoeficiente() << "x^" << a.getExponente();
        return o;
    }
    
    inline Monomio operator+(const Monomio &a, const Monomio &b) {
        Monomio res;
    
        if (a.getExponente() != b.getExponente())
            throw "Suma de monomios con exponente diferente!";
        else {
            res = Monomio (a.getCoeficiente() + b.getCoeficiente(), a.getExponente());
        }
    
        return res;
    }
    
    inline Monomio operator-(const Monomio &a, const Monomio &b) {
        Monomio res;
    
        if (a.getExponente() != b.getExponente())
            throw "Suma de monomios con exponente diferente!";
        else {
            res = Monomio (a.getCoeficiente() - b.getCoeficiente(), a.getExponente());
        }
    
        return res;
    }
    
    inline Monomio operator*(const Monomio &a, const Monomio &b) {
        Monomio res = Monomio (a.getCoeficiente() * b.getCoeficiente(), a.getExponente() + b.getExponente());
        return res;
    }
    
    #endif  /* MONOMIO_H */
    

    Plus:我使用的主文件(我还为Monomio做了一些测试:

    #include "Polinomio.h"
    
    using namespace std;
    
    /*
     * 
     */
    int main(int argc, char** argv) {
    
        Monomio a (2, 2);
        Monomio b (3, 5);
        Monomio c (3, 2);
    
        cout << a << " + " << c << " = " << a + c << endl;
        cout << a << " - " << c << " = " << a - c << endl;
        cout << a << " * " << b << " = " << a * b << endl;
    
        Polinomio pol (5);
        pol.rellenarRandom();
        cout << "pol: " << pol << endl;
        cout << "primero: " << pol.getMonomios().at(0);
        return 0;
    }
    

1 个答案:

答案 0 :(得分:3)

Monomio::Monomio(const Monomio& orig) {
}

我不了解你,但这个功能对我来说不对。

(是的,这是错误)

this->monomios = vec;

这使得monomios等于&#34;值&#34; vec,表示它复制了所有Monomio个对象。它使用您编写的复制构造函数进行复制。您编写的复制构造函数根本没有为正在构造的Monomio对象分配任何内容,因此它们正在获取恰好位于内存中的值。通常,巧合的是,它碰巧是另一个向量的价值。有时它不是。