矢量的第一个元素与奇怪的数据(First Element of vector with weird data)

编程入门 行业动态 更新时间:2024-10-25 05:21:44
矢量的第一个元素与奇怪的数据(First Element of vector with weird data)

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

我有一个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填充,然后它将vetor“Monomio”(坏名字,我知道)设置为这个随机向量。

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

-11x ^ 0 -69x ^ 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做了这个输出:

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

我测试了很多次,试图发现错误,但似乎没有模式。 第一个数字每次都不同,但从来不应该是它。

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

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

谢谢你的帮助!

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

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

我在集合之前修改了这个cout,看到给我带来问题的成员:

cout <<“VEC:”; cout << vec [0] << endl;

setMonomios(VEC);

在setMonomios中,我修改了setMonomios:

void Polinomio :: setMonomios(vector vec){cout <<“set:”<< vec [0] << endl; this-> monomios = vec; cout <<“postset:”<< this-> monomios [0] << endl; }

结果:

VEC:0x ^ 0 设定:3670352x ^ 0 postset:3670352x ^ 0

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

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

Tony Jiang:

这样做,结果是(只有第一个元素,给出问题):* VEC:0x ^ 0 * set:3670352x ^ 0 * postset:3670352x ^ 0

Wolfgang.Finkbeiner:

<<运算符重载:

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(可能不是最小的,但它是一个小项目):

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

和头文件(主要是为运营商,但万一你看到任何奇怪的请告诉我):

#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() &t;< "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; }

I will try to explain the best I can the problem:

I have a class Polinomio (Polynomial in spanish). that has a vector of the class Monomio (Monomial).

In Polinomio I have this method:

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

It fills with random Monomials the vector vec, then it sets the vetor "Monomio" (bad named, I know) to this random vector.

The cout's make this output (it varies, but an example):

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

The setter is pretty simple:

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

And in the main I have:

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

That cout makes this output:

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

I tested many times, to try to detect the mistake, but it appears to follow no pattern. The first number is different every time, but never the one it should be.

It's not a problem of the overload of << on the Polinomo class, since I also tested another access to that element, and it shows it "correctly" (the same, even if it's not what it should).

The problem must be on the setter, but I ust can't figure out what the problem is.

Thanks for your help!

EDIT: (modified the setter name that was wrong to setMonomio

I added one more test, and it's driving me CRAZY. This is what I did:

I modified this cout before the set, to see the member that gives me problems:

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

setMonomios(vec);

In setMonomios, I modified setMonomios:

void Polinomio::setMonomios(vector vec) { cout << "set: " << vec[0] << endl; this->monomios = vec; cout << "postset: " << this->monomios[0] << endl; }

result:

VEC :0x^0 set: 3670352x^0 postset: 3670352x^0

So, the valor get's modified somehow when I call the setter?

ANSWERS (EDIT's you have asked for):

Tony Jiang:

Did that, the result was (only with the first element, that gives problems): * VEC :0x^0 * set: 3670352x^0 * postset: 3670352x^0

Wolfgang.Finkbeiner:

The << operator overload:

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 does always return the same value. The reason I don't use vector.size () is because in some other functions I use it before initializing the vector, or while modifying it, so it can have unexpected results if I do. Anyway, it's tested, it doesn't give any problem.

PaulMcKenzie

I don't know what you mean exactly by the copy semantics, but anyway, I'll post it:

#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

The MCVE (maybe not exactly Minimal, but it's a small project):

Apart from the class Monomio (posted above) to reproduce you might need:

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

And the Header files (for the operators mainly, but in case you see anything weird please tell me):

#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: the Main file I use (I also did a few tests for 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对象分配任何内容,因此它们正在获取恰好位于内存中的值。 通常,巧合的是,它恰好是另一个向量的价值。 有时它不是。

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

I don't know about you, but that function looks wrong to me.

(Yes, this is the bug)

this->monomios = vec;

This makes monomios equal to the "value" of vec, which means it makes copies of all of the Monomio objects. It makes copies using the copy constructor you wrote. The copy constructor you wrote does not assign anything at all to the Monomio object being constructed, so they were getting values that just happened to be in memory. Often, by coincidence, it happened to be the value of the other vector. And sometimes it wasn't.

更多推荐

本文发布于:2023-07-18 11:43:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1159828.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:第一个   矢量   元素   奇怪   数据

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!