具有奇怪数据的向量的第一个元素

First Element of vector with weird data

本文关键字:向量 元素 第一个 数据      更新时间:2023-10-16

我会尽力解释这个问题:

我有一个类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);
}

它用随机单调填充向量vec,然后将否决符"Monomio"(我知道名字不好)设置为这个随机向量。

cout产生这种输出(它有所不同,但只是一个例子):

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

设置器非常简单:

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输出:

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

我测试了很多次,试图找出错误,但似乎没有遵循任何模式。第一个数字每次都不一样,但从来都不是应该的数字。

这不是<lt;在Polinomo类上,因为我还测试了对该元素的另一个访问,它显示它"正确"(相同,即使它不是应该的)。

问题一定出在二传手身上,但我就是搞不清问题出在哪里

谢谢你的帮助!

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

我又增加了一个测试,这让我抓狂。这就是我所做的:

  1. 我在片场前修改了这个cout,以查看给我带来问题的成员:

    cout<lt;"VEC:";cout<lt;vec[0]<lt;endl;

    setMonomios(vec);

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

    void Polinomio::setMonomios(矢量vec){cout<lt;"设置:"<lt;vec[0]<lt;endl;this->monomios=vec;cout<lt;"postset:"<lt;这个->单体[0]<lt;endl;}

结果:

  • VEC:0x%0
  • 套装:3670352x^0
  • 附后:3670352x^0

所以,当我叫二传手时,英勇得到了某种程度的修改?

答案(您要求的编辑):

Tony Jiang:

这样做的结果是(只有第一个元素会出现问题):*VEC:0x%0*套装:3670352x^0*附后:3670352x^0

Wolfgang.Finkbeiner:

<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;
}

道格拉斯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(张贴在上面)复制你可能需要:

脊髓灰质炎:

#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;
}

头文件(主要针对操作员,但如果你看到任何奇怪的东西,请告诉我):

#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 */

另外:我使用的主文件(我也为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;
}
Monomio::Monomio(const Monomio& orig) {
}

我不知道你的情况,但我觉得这个功能不对。

(是的,这就是错误)

this->monomios = vec;

这使得monomios等于vec的"值",这意味着它复制所有Monomio对象。它使用您编写的复制构造函数进行复制。您编写的复制构造函数根本没有为正在构造的Monomio对象分配任何内容,所以它们得到的值恰好在内存中。通常,巧合的是,它恰好是另一个向量的值。有时情况并非如此。