我宁愿使用一个类,但我的要求比这简单。这是创建二维元素数组,每个元素表示一个结构数据类型。问题是当我将多个向量传递给函数后尝试进行变量初始化时。我的代码的简单版本如下:
#include <iostream>
#include <vector>
using namespace std;
struct Twalker
{
int state;
float x,y;
};`
void initialise(vector<vector<Twalker>>& walker,int n)
{
vector<Twalker> tempWalker;
for (int i=0; i<n; i++)
{
tempWalker.state.push_back(+1); //need help!
tempWalker.y.push_back(float(rand() % 10)); //need help!
tempWalker.x.push_back(0.0); //need help!
}
walker.push_back(tempWalker);
}
int main(int argc, char** argv)
{
int n = 5;
vector<vector<Twalker>> walker;
initialise(walker,n);
}
我已经看到我们可以使用push_back
将多个值添加到结构中。但我试图更自由地输入价值观。使用push_back
时是否遗漏了任何语法?几个小时前我开始学习向量的概念,我试图将代码从arrays
转移到vectors
。
答案 0 :(得分:1)
首先,结构等同于类 - 唯一的区别是它们的成员默认是公共的,而类成员默认是私有的。
您的程序有多个问题,以下是一个可能的解决方案:
#include <iostream>
#include <vector>
#include <ctime>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
struct Twalker
{
int state;
float x,y;
};
// Initialize the vector of vectors of Twalker objects
void initialise(vector<vector<Twalker>>& walker, int nv, int n)
{
Twalker wlk;
vector<Twalker> tempWalker;
// Outer loop - vector of vectors
for (int i=0; i<nv; i++){
// Inner loop - vector of Twalker objects
for (int j=0; j<n; j++){
// Temporary Twalker
wlk.state = 1;
wlk.x = 0.0;
wlk.y = float(rand()%10);
// Add it to the inner vector
tempWalker.push_back(wlk);
}
// Add the inner vector to the vector of vectors
walker.push_back(tempWalker);
// Reset the inner vector
tempWalker.clear();
}
}
int main()
{
// Set the seed
std::srand(std::time(0));
int nv = 3, n = 2;
vector<vector<Twalker>> walker;
// Initialize
initialise(walker, nv, n);
// Print
for (int i = 0; i < nv; i++)
for (int j = 0; j < n; j++)
cout << walker[i][j].state << " "
<< walker[i][j].x << " "
<< walker[i][j].y << endl;
return 0;
}
你绝对应该阅读更多关于向量的内容,包括迭代器和size_t
等基础知识和概念。在这里我只使用了你熟悉的变体,但是这个程序的某些部分通常看起来很不一样(比如打印部分)。
与此代码相关的一些注意事项和建议:
using namespace std
。例如,您可能会意外地用自己的方法覆盖stl函数。建议您将using
用于特定的常用组件,例如cin
,cout
,vector
等。nv
倍!srand
函数每次运行程序时都会重置随机种子。没有它,执行相同的程序将始终导致相同的随机数集。 argc
和argv
。此外,您可以但不必在main的末尾添加return 0
语句(如果您不这样做,编译器将为您添加它)。tempWalker
,而是在内循环中声明它,每次内部循环都会创建一个新的空tempWalker
向量循环重新进入。另一方面,正如@MatteoItalia所指出的,这种方法在每次执行内部循环时为内部向量分配和释放内存。在具有较大向量的较大程序中,这种冗余分配将导致性能损失,应该避免。