我在这里搜索了很多,但对于我来说,对于c ++中的高级新手来说,没有正确的解释。我之前使用过结构矢量,现在我得到了分段错误......
这就是为什么我想知道这些物体是如何工作的,以及它是否正如我所做的那样!
我有一个类似
的结构struct numberOfSpecies {
int predator;
int prey1;
int prey2;
};
及其矢量:
std::vector<numberOfSpecies> size;
在我调整大小并填充值之前。
size.resize(100);
实际上这是做什么的?这是否适合结构? 看起来它是用零初始化的......
现在我这样做:
size[t].predator=0;
size[t].prey1=0;
size[t].prey2=0;
for(int k = 0; k < N; ++k){
size[t].predator++;
size[t].prey1++;
size[t].prey2++;
}
这是对的吗?可能的问题在哪里?怎么做得更好?
答案 0 :(得分:3)
最简单,最正确的&#39;这里的解决方案可能只是使用属于向量对象的resize()
函数进行聚合初始化(如果你有权访问c ++ 11等),就像
size.resize(100,{0,0,0}); //aggregate initialization
for(int k = 0; k < N; ++k)
{
size[t].predator++;
size[t].prey1++;
size[t].prey2++;
}
每个numberOfSpecies
对象的所有成员都将初始化为0.
答案 1 :(得分:1)
此:
size[t].predator=0;
size[t].prey1=0;
size[t].prey2=0;
将零写入t
的{{1}}元素 - 可能有用也可能没用:
此:
size
将for(int k = 0; k < N; ++k){
size[t].predator++;
size[t].prey1++;
size[t].prey2++;
}
t
个元素增加N次。这似乎不太可能有用。我想你想要的是:
size
答案 2 :(得分:0)
对静态参数使用 value 参数。
#include <vector>
struct foo{
int g;
int h;
int l;
};
int main()
{
std::vector<foo> manyFoo(10, {0});
manyFoo.resize(60, {0});
}
如果你想增加你的向量,你也可以将任意值放入结构中 ->
#include <iostream>
#include <vector>
struct foo{
foo(int aG,int aH, int aL):g(aG),h(aH),l(aL) {};
int g;
int h;
int l;
};
int main() {
std::vector<foo> lVec;
for (int i=0;i<10;i++) {
lVec.emplace_back(foo(i,i*2,i*4));
}
int lPos=0;
for (auto &rFoo: lVec) {
std::cout << "Item pos" << lPos++ << " g:" << rFoo.g << " h:" << rFoo.h << " l:" << rFoo.l << std::endl;
}
return EXIT_SUCCESS;
}
如果您知道向量的大小并且想要填充它,您可以 ->
#include <iostream>
#include <vector>
struct foo{
foo(int aG,int aH, int aL):g(aG),h(aH),l(aL) {};
int g;
int h;
int l;
};
int main() {
std::vector<foo> lVec(10,{0,0,0});
int lPos = 0;
for (auto &rFoo: lVec) {
rFoo = foo(lPos,lPos*2,lPos*4);
lPos++;
}
lPos=0;
for (auto &rFoo: lVec) {
std::cout << "Item pos" << lPos++ << " g:" << rFoo.g << " h:" << rFoo.h << " l:" << rFoo.l << std::endl;
}
return EXIT_SUCCESS;
}
答案 3 :(得分:-1)
您可以为结构添加默认构造函数。新代码看起来像这样:
struct numberOfSpecies {
numberOfSpecies (): predator(0), prey1(0), prey2(0) { } // default constructor
int predator;
int prey1;
int prey2;
};
这样,当应用resize时,您的结构将在向量内正确初始化。