向量结构中的向量结构

时间:2014-08-26 22:33:41

标签: c++ vector struct

这段代码怎么了?

#include <vector>
#include <iostream>

typedef struct {
    float x, y, z;
} aaa;

typedef struct {
    float r, g, b;
    std::vector<aaa> a;
} bbb;

typedef struct {
    float s, t, p;
    std::vector<bbb> b;
} ccc;

int main()
{
    aaa o;
    std::vector<ccc> c;

    c.resize(1); // its OK

    c[0].b.resize(4); // its OK

    c[0].b[0].a.resize(2); // ??? its allocate 4 instead of 2 but why?
    c[0].b[1].a.resize(2); // its OK
    c[0].b[2].a.resize(2); // its OK
    c[0].b[3].a.resize(2); // its OK

    o.x = 1.0f;
    o.y = 0.5f;
    o.z = 2.567f;
    c[0].b[0].a.push_back(o);

    o.x = 0.0f;
    o.y = 3.4f;
    o.z = 3.67f;
    c[0].b[0].a.push_back(o);

    std::cout << c[0].b[0].a[0].x << std::endl;
    std::cout << c[0].b[0].a[0].y << std::endl;
    std::cout << c[0].b[0].a[0].z << std::endl;

    std::cout << c[0].b[0].a[1].x << std:: endl;
    std::cout << c[0].b[0].a[1].y << std::endl;
    std::cout << c[0].b[0].a[1].z << std::endl;

    system("pause");

    return 0;
}

这是监视窗口输出:

vector c: size = 1; // its OK

vector b: size = 4; // its OK

vector a[0]: size = 4; // ??? (4) ???

vector a[1]: size = 2; // its OK

vector a[3]: size = 2; // its OK

vector a[4]: size = 2; // its OK

2 个答案:

答案 0 :(得分:1)

std::vector::resize()调整矢量大小。因此,您将其调整为2,然后再添加2个项目(push_back()),因此您的尺寸为4。

如评论中所述,如果您使用

std::cout << "c[0].b[0].a.size() = " << c[0].b[0].a.size() << std::endl;

在代码的不同位置,您将看到合适的尺寸。

答案 1 :(得分:1)

如果向量的当前大小小于resize()中指定的大小,则成员函数resize将创建新元素。

成员函数push_back将新元素附加到向量。

声明之后

c[0].b[0].a.resize(2); 

矢量a将有两个元素。并在这两个陈述之后

   c[0].b[0].a.push_back(o);
   //...
   c[0].b[0].a.push_back(o);

它将附加另外两个新元素。因此,作为结果,矢量a将具有4个元素。

如果你想只有两个元素,那么你必须编写以下内容而不是使用函数push_back

   c[0].b[0].a[0] = o;
   //...
   c[0].b[0].a[1] = o;