Я делаю векторную программу, которая должна производить 3 разных вектора каждый раз.
Это код, который я до сих пор:
Файл GenerateVector.h:
#ifndef Vector_GenerateVector_h
#define Vector_GenerateVector_h
#endif
#include <string>
#include <sstream>
#include <vector>
using namespace std;
class FourVector
{
int x, y, z, t;
public:
FourVector (int a, int b, int c, int d);
int getX() {return x;}
int getY() {return y;}
int getZ() {return z;}
int getT() {return t;}
};
FourVector::FourVector (int a, int b, int c, int d) {
x = a;
y = b;
z = c;
t = d;
}
string toString(FourVector vec) //get vector function
{
ostringstream s; //making a new string stream
s << "("<< vec.getX() << ", " << vec.getY() << ", " << vec.getZ() << ", " << vec.getT() << ")"; // append to string stream
string combinedString = s.str(); //cast string stream to a string
return combinedString; //return string.
}
FourVector genVector()
{
int x = rand() % 10;
int y = rand() % 10;
int z = rand() % 10;
int t = rand() % 10;
FourVector v (x, y, z, t);
return v;
}
vector<FourVector> createArrayFourVectors()
{
vector<FourVector> vecs; //create array of threevectors.
for (int i = 0; i < 3; i++) {
FourVector v = genVector();
vecs.assign(i, v); // assign threevectors to the array to fill it up.
}
return vecs;
}
Файл main.cpp:
#include <iostream>
#include "GenerateVector.h"using namespace std;
int main(int argc, const char * argv[])
{
int seed = static_cast<int>(time(nullptr));
srand(seed);
vector<FourVector> v = createArrayFourVectors();
for (int i = 0; i < 3; i++) {
FourVector tv = v[i];
cout << toString(tv) << endl;
}
}
(5, 1, 4, 8)
(5, 1, 4, 8)
(0, 0, 0, 0)
Программа завершилась с кодом выхода: 0
1-я проблема: я не понимаю, почему вместо 3 получается только 2 вектора.
Вторая проблема: почему вектор № 1 и вектор № 2 всегда одинаковы? Я использовал srand () только один раз, в начале своей основной функции, и до сих пор у меня есть эта проблема. Я полагал, что мой компьютер был слишком быстрым для того времени, чтобы значительно измениться, чтобы произвести другой набор случайных чисел, но попытка вставить usleep (1000000) не имела никакого значения.
Любая помощь будет оценена!
Проблема в vecs.assign(i, v);
, Эта форма assign
берет целое число и объект и устанавливает вектор равным этому количеству копий объекта. У вас есть петля i
принимая значения 0, 1 и 2, так что на последней итерации цикла вы будете устанавливать две копии вашего FourVector
объект. Это означает, что первые два элемента vec
будут идентичные копии, а длина вектора будет 2
и любая попытка получить доступ за пределами этого будет неопределенным поведением.
Это из-за неопределенное поведение. std::vector::assign
функция заменяет существующий запись в векторе, но вектор пустой, поэтому вы пишете в несуществующую запись в векторе.
Простое решение? использование push_back
вместо.