簡體   English   中英

矢量結構

[英]vector struct in vector struct in

這段代碼有什么問題?

#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 

std::vector::resize()調整向量的大小。 因此,將其大小調整為2,然后再添加2個項目(使用push_back() ),因此大小為4。

如評論中所述,如果您使用

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

在代碼的不同點,您將看到適當的大小。

如果向量的當前大小小於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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM