这段代码怎么了?
#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
答案 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;