Массив инициализации строк в c ++ - PullRequest
2 голосов
/ 05 ноября 2011

я знаю, что могу инициализировать так

std::string foo [3] = {"T1","T2","T3"};

но что если объявить это раньше, я должен инициализировать каждый из них по-своему? Пример

std::string foo [3];
foo[0] = "T1"
foo[1] = "T2"
foo[2] = "T3"

я имею в виду, что в строке даны все значения одновременно foo = {"T1", "T2", "T3"}

Ответы [ 5 ]

1 голос
/ 05 ноября 2011

Технически, вы не можете инициализировать его после объявления. Нюанс важен, потому что во втором примере вы назначаете отдельные строки. Теперь вы хотите назначить весь массив, который не работает. Если бы вы использовали более интеллектуальную структуру данных, такую ​​как std::vector, вы действительно могли бы назначить все значения в одной инструкции, потому что вектор отбрасывает старые строки и создает новые, которые будут скопированы из ваших строк "T1", ...

1 голос
/ 05 ноября 2011

Нет, (в отличие от Java), когда вы объявляете массив, он создает строку в каждом индексе, используя конструктор по умолчанию.

Изменить для ясности:

под "новым" я не имею в виду распределение new в куче, оно хранится там, где вы его объявили, в разделе данных (для глобальных) или в стеке (локальные).


Из комментария кажется, что вы думаете о чем-то вроде этого:

std::string foo[3];
...
foo = {"a","b","c"}; // DOES NOT WORK

Нет, вы не можете этого сделать. foo уже имеет выделенное и инициализированное пространство, и вы не можете просто назначить целые массивы таким образом (кроме как в инициализаторе). Если вы объявили это как std::string *foo, вы могли бы, но я не рекомендую этого в этом случае.

1 голос
/ 05 ноября 2011

что, если объявить его раньше, нужно ли инициализировать каждый из них по-своему?

Вы не инициализируете каждый из них по отдельности.Они инициализируются пустой строкой (построена по умолчанию), а затем вы присваиваете им значения.

0 голосов
/ 05 ноября 2011

В C ++ 0x вы сможете использовать обобщенные списки инициализаторов.Но это не будет сильно отличаться от записи назначений от руки.

Обратите внимание, однако, что в случае, когда у вас было сложное выражение, повторяемое для каждого назначения (как указывает K-балл, разныемежду присваиванием и инициализацией иногда бывает важно привыкнуть различать):

ALongPointerName->ALongMemberName.ALongArrayName[0] = "T1";
ALongPointerName->ALongMemberName.ALongArrayName[1] = "T2";
ALongPointerName->ALongMemberName.ALongArrayName[2] = "T3";

Вы можете использовать ссылку, чтобы сократить это значение:

auto& a = ALongPointerName->ALongMemberName.ALongArrayName;
a[0] = "T1";
a[1] = "T2";
a[2] = "T3";

, которое отнимает большую частьболь.

0 голосов
/ 05 ноября 2011

Я все еще изучаю C ++ и не очень опытен, но я считаю, что это, пожалуй, лучший способ, если вы хотите инициализировать после объявления. Или вы можете использовать цикл for, например, чтобы заполнить его.

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