【问题标题】:Array of struct initialization结构初始化数组
【发布时间】:2012-01-08 08:06:26
【问题描述】:
typedef struct { double x, y; } vec;
typedef struct { int n; vec* v; } polygon_t, *polygon;

#define BIN_V(op, xx, yy) vec v##op(vec a, vec b) { \
    vec c; c.x = xx; c.y = yy; return c; }

#define BIN_S(op, r) double v##op(vec a, vec b) { return r; }

BIN_V(sub, a.x - b.x, a.y - b.y);
BIN_V(add, a.x + b.x, a.y + b.y);
BIN_S(dot, a.x * b.x + a.y * b.y);
BIN_S(cross, a.x * b.y - a.y * b.x);

vec testPoints[] = {
                    {1, 1},
                    {3, 3},
                    {3, 5},
                    {5, 2},
                    {6, 3},
                    {7, 4}
                   };

结构数组最后的作用是什么?我不太明白{1, 1}是怎么变成vec的。

如果我想要一个vector<vec> allPoints,我怎样才能将一个 vec 推入这个向量?这不起作用allPoints.push_back({1, 2});,以及allPoints.push_back(new vec(1, 2));

【问题讨论】:

  • c++,我觉得是一样的,只是c没有向量。
  • 不,C 和 C++ 不一样。请注意,在 C++ 中您不需要 typedef struct
  • 我的意思是,这段代码最初是来自C,我只是因为我想使用Vector而改为C++。它可以在没有向量推送的情况下在 C++ 中编译
  • 但是感谢您指出这一点。

标签: c++ arrays vector struct


【解决方案1】:

{} 是一个初始化器,并且:

vec v = { 2, 3 };

相当于:

vec v;
v.x = 2;
v.y = 4;

对于数组:

int myints[3] = { 1, 2, 3 };

将初始化数组中的元素:

myints[0] = 1;
myints[1] = 2;
myints[2] = 3;

对于结构数组:

vec mystructs[2] = { { 1, 2}, { 2, 3} };

初始化结构数组:

mystructs[0].x = 1;
mystructs[0].y = 2;
mystructs[1].x = 2;
mystructs[1].y = 3;

要以您表达的方式使用std::vector<vec>,请将构造函数添加到vec 结构:

struct vec
{
    vec(double a_x, double a_y) : x(a_x), y(a_y) {}
    double x,y;
};

std::vector<vec> allPoints;

allPoints.push_back(vec(1,2));

【讨论】:

  • 这很清楚。如果我不添加构造函数,我可以做vec temp; temp.x = 1; temp.y=2; 对吗?
  • 是的,然后是allPoints.push_back(temp);
  • 或者,vec temp = {1, 2}; allPoints.push_back(temp);
【解决方案2】:

在 C++2003 中动态构建类 C 结构体不起作用。它适用于 C++2011:

std::vector<vec> v;
v.push_back(vec{ 1, 2 });

如果您需要在 C++2003 中创建 std::vector&lt;vec&gt;,最好的方法可能是创建一个辅助函数来初始化您的对象

vec make_vec(double a, double b) {
    vec v = { a, b };
    return v;
}
...
v.push_back(make_vec(1, 2));

【讨论】:

    猜你喜欢
    • 2015-07-29
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    相关资源
    最近更新 更多