Как инициализировать вложенные структуры в C++?

Вы можете пройти строку с двумя указателями и найти символы между двумя двойными кавычками (или любым другим символом по вашему выбору):

func substrings(of str: String, between char: Character) -> [String] {
    var array = [String]()

    var i = str.startIndex

    while i < str.endIndex {
        while i < str.endIndex, str[i] != char {
            i = str.index(after: i)
        }

        if i == str.endIndex { break }

        i = str.index(after: i)

        var j = i

        while j < str.endIndex, str[j] != char { 
            j = str.index(after: j) 
        }

        guard j < str.endIndex else { break }

        if j > i { array.append(String(str[i..<j])) }

        i = str.index(after: j)
    }

    return array
}

И вот несколько вариантов использования:

let s1 = "\"OneV\", \"TwoV\", \"ThreeV\""
substrings(of: s1, between: "\"") //["OneV", "TwoV", "ThreeV"]

let s2 = "\"OneV\", \"TwoV\", \"Thr"
substrings(of: s2, between: "\"") //["OneV", "TwoV"]

let s3 = "|OneV|, |TwoV|, |ThreeV|"
substrings(of: s3, between: "|") //["OneV", "TwoV", "ThreeV"]

let s4 = "abcdefg"
substrings(of: s4, between: ",") //[]
10
задан Bill Lynch 25 January 2016 в 05:24
поделиться

3 ответа

Вы обычно инициализируете его с { ... }:

Player player = { 
  vector<float>(xcords,xcords + (sizeof(xcords) / sizeof(float)) ),
  vector<float>(ycords,ycords + (sizeof(ycords) / sizeof(float)) ),
  5, 1, 5, 1, 5, 1, 5, 1, 
  1.0f,1.0f,1.0f,                         //red, green, blue
  0.0f,0.0f,                              //r_leg,l_leg
  {4,4,4},                                //number points per polygon
  true,false
};   

Теперь, это использует "фигурную скобку elision". Некоторые компиляторы предупреждают для того, что, даже при том, что это абсолютно стандартно, потому что это могло смутить читателей. Лучше Вы добавляете фигурные скобки, таким образом, становится ясно, что инициализируется где:

Player player = { 
  vector<float>(xcords,xcords + (sizeof(xcords) / sizeof(float)) ),
  vector<float>(ycords,ycords + (sizeof(ycords) / sizeof(float)) ),
  { { 5, 1 }, { 5, 1 }, { 5, 1 }, { 5, 1 } }, 
  1.0f, 1.0f, 1.0f,               //red, green, blue
  0.0f, 0.0f,                     //r_leg,l_leg
  { 4, 4, 4 },                    //number points per polygon
  true, false
};

Если Вы только хотите инициализировать x член точек, можно сделать так путем исключения другого инициализатора. Оставление элементами в агрегатах (массивы, структуры) будет значением, инициализированным к "правильным" значениям - так, a NULL для указателей, a false для bool, нуля для ints и так далее и использования конструктора для определяемых пользователем типов, примерно. Строка, инициализирующая точки, похожа на это затем

{ { 5 }, { 5 }, { 5 }, { 5 } }, 

Теперь Вы видели опасность использовать фигурную скобку elision. Если Вы добавляете некоторого участника к своей структуре, все инициализаторы "смещаются независимо" их фактические элементы, которые они должны инициализировать, и они могли поразить другие элементы случайно. Таким образом, Вы лучше всегда используете фигурные скобки в соответствующих случаях.

Рассмотрите использование конструкторов все же. Я только что завершил Ваш код, показывающий, как Вы сделали бы это с помощью включенных инициализаторов фигурной скобки.

19
ответ дан 3 December 2019 в 16:31
поделиться

Похоже, что ограничительная рамка должна просто содержать плавания, не Точки?

Это сказало, что это могло бы работать:

Player player = { 
vector<float>(xcords,xcords + (sizeof(xcords) / sizeof(float)) ), //xcords of player
vector<float>(ycords,ycords + (sizeof(ycords) / sizeof(float)) ), //ycoords of playe
{{1.0,5.0},{1.0,5.0},{1.0,5.0},{1.0,5.0}},
1,1,1,                                          //red, green, blue
0.0f,0.0f,                              //r_leg,l_leg
{4,4,4},                                //number points per polygon
true,false};  

(Непротестированный)...

2
ответ дан 3 December 2019 в 16:31
поделиться

Можно добавить значения по умолчанию к структуре как так:

struct Point{
   Point() : x(0), y(0)
     { };

   float x;
   float y;
};

или

struct Point{
   Point() 
     { 
       x = 0;
       y = 0;
     };

   float x;
   float y;
};

Для добавления тех значений во время конструкции добавьте параметры к конструкторам как это:

struct Point{
   Point(float x, float y) 
     { 
       this->x = x;
       this->y = y;
     };

   float x;
   float y;
};

и инстанцируйте их с ними:

Point Pos(10, 10);
Point *Pos = new Point(10, 10);

Это также работает на Ваши другие структуры данных.

4
ответ дан 3 December 2019 в 16:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: