具有奇怪数据的向量的第一个元素
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,然后将否决符"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
我又增加了一个测试,这让我抓狂。这就是我所做的:
我在片场前修改了这个cout,以查看给我带来问题的成员:
cout<lt;"VEC:";cout<lt;vec[0]<lt;endl;
setMonomios(vec);
在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
对象分配任何内容,所以它们得到的值恰好在内存中。通常,巧合的是,它恰好是另一个向量的值。有时情况并非如此。
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 在 C++ 中输出枚举类类型的向量元素
- 用向量的向量元素初始化向量的空向量
- 为什么不允许使用可变长度数组作为向量元素?
- 在函数中传递向量元素
- 使用 Rcpp 加速替换迭代算法中的列表和向量元素是否合法?
- 返回向量元素的 l 值的正确方法是什么?
- 当向量增长时,指向向量元素的C++指针是否无效
- 如何在C++中从一个向量元素减去std::unorderede_map向量元素并更新它
- C++:向量元素赋值导致访问冲突
- 将向量元素与字符串元素进行比较,而不初始化向量
- 从2D矢量中找出最小尺寸的向量元素的更好方法
- 当我尝试将一个向量元素的值分配给另一个向量元素时,为什么我的应用程序会崩溃
- 使用递归C++向量元素的总和
- 如何查找为数组中的最低值编制索引的向量元素
- 限制指针访问STL ::向量元素
- 访问索引指向向量元素时的seg故障 - 做错了什么
- 如何使用指针访问向量元素的各个元素
- 向量元素数据损坏了Find()操作
- 将字符值分配给向量元素.C