Инициализировать структуру, которая содержит вектор - PullRequest
9 голосов
/ 02 февраля 2012

Я ищу метод для инициализации сложной структуры, которая содержит вектор в одной строке.

Например, если у меня есть такая структура:

struct A{
  double x;
  double y;
};
struct B{
  double z;
  double W;
};
struct C{
  A a;
  B b;
};

Я могу инициализировать C следующим образом: C c = {{0.0,0.1},{1.0,1.1}};

Но что, если мне нужно инициализировать такую ​​структуру?

struct A{
  double x;
  double y;
};
struct B{
  vector<double> values;
};
struct C{
  A a;
  B b;
};

Я должен сделать это в одной строке, потому что я хочу, чтобы пользователи моего приложения указывали в одном поле все начальные значения. И, конечно, я бы предпочел стандартный способ сделать это, а не индивидуальный.

Спасибо!

Ответы [ 6 ]

9 голосов
/ 02 февраля 2012

Вы можете инициализировать C очень похожим образом в C ++ и в C:

C c = {{0.3, 0.01}, {{14.2, 18.1, 0.0, 3.2}}};
3 голосов
/ 02 февраля 2012

Если вы не используете C ++ 11 (так что вы не можете использовать предложение Mankarse), boost может помочь:

C c = { {0.1, 0.2}, {boost::assign::list_of(1.0)(2.0)(3.0)} };
0 голосов
/ 02 февраля 2012

Вам просто нужно будет использовать один из конструкторов , если у вас нет нового синтаксиса инициализации C ++ 11.

    C c = {{1.0, 1.0}, {std::vector<double>(100)}};

Вектор выше содержит 100 элементов,Невозможно уникально инициализировать каждый элемент в конструкции вектора.

Вы можете сделать ...

 double values[] = {1, 2, 3, 4, 5};
 C c = {{1.0, 1.0}, {std::vector<double>(values, values+5)}};

или, если вы всегда знаете количество элементов, использовать std :: arrayВы можете инициализировать, как вы хотите.

0 голосов
/ 02 февраля 2012

Вопрос в том, как инициализировать B во втором примере?

Вы не можете инициализировать вектор следующим образом:

std::vector<int> v = { 1, 2, 3 }; // doesn't work

Вы можете сделать это

int data[] = { 1, 2, 3 };
std::vector<int> v( &data[0], &data[0]+sizeof(data)/sizeof(data[0]));

(есть более хорошие способы сделать это). Это не "одна строка", хотя.

Это работает, и я проверил это:

template< typename T >
struct vector_builder
{
     mutable std::vector<T> v;
     operator std::vector<T>() const { return v; }
};

template< typename T, typename U >
vector_builder<T>& operator,(vector_builder<T>& vb, U const & u )
{
vb.v.push_back( u );
return vb;
}

struct B
{
  vector<double> v;

};

B b = { (vector_builder(),1.1,2.2,3.3,4.4) };

C c = { {1.1, 2.2 }, {(vector_builder(),1.1,2.2,3.3,4.4)} };
0 голосов
/ 02 февраля 2012
struct C {
    A a;
    B b;
    C(double ta[2], vector<double> tb) {
        a = A(ta[0],ta[1]);    // or a.x = ta[0]; a.y = ta[1]
        b = tb;
    }
};

тогда вы можете инициализировать что-то вроде

C c = C( {0.0, 0.1} , vector<double> bb(0.0,5) );
0 голосов
/ 02 февраля 2012

Вы можете сделать это:

C obj = { { 0.0, 0.1f }, std::vector<double>( 2, 0.0 ) };

Но, очевидно, это не идеально, поскольку все значения в вашем векторе должны быть одинаковыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...