c ++初始化结构向量的正确方法

时间:2016-09-09 10:26:20

标签: c++ vector struct

我在这里搜索了很多,但对于我来说,对于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++;
}

这是对的吗?可能的问题在哪里?怎么做得更好?

4 个答案:

答案 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时,您的结构将在向量内正确初始化。