Массив инициализации структуры - PullRequest
2 голосов
/ 08 января 2012
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));

Ответы [ 2 ]

4 голосов
/ 08 января 2012

{} является инициализатором и:

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));
2 голосов
/ 08 января 2012

Создание C-подобных структур на лету не работает в C ++ 2003. Работает в C ++ 2011:

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

Если вам нужно создать std::vector<vec> в C ++ 2003, возможно, лучше всего создать вспомогательную функцию для инициализации ваших объектов

vec make_vec(double a, double b) {
    vec v = { a, b };
    return v;
}
...
v.push_back(make_vec(1, 2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...