2012-01-08 92 views
2
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));

+0

这是C或C++? – 2012-01-08 08:08:51

+0

这是C++,而不是C. – 2012-01-08 08:09:17

+0

C++,我认为它是一样的,唯一的事情是c没有向量。 – 2012-01-08 08:09:51

回答

4

{}是一个初始化和:

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; 

要使用你表示一个构造函数添加到vec结构的方式std::vector<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)); 
+0

这很清楚。如果我不添加构造函数,我可以做'vec temp; temp.x = 1; temp.y = 2;'对吗? – 2012-01-08 09:02:14

+0

是的,然后'allPoints.push_back(temp);'。 – hmjd 2012-01-08 09:06:35

+0

或'vec temp = {1,2}; allPoints.push_back(温度);'。 – hmjd 2012-01-08 11:48:55

2

在C++ 2003中不能正常构建类C结构。它工作在C++ 2011:

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

如果你需要创建在C++ std::vector<vec> 2003最好的办法可能是创建一个辅助函数来初始化对象

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