Инициализировать массив в значение по умолчанию (за исключением, где указано) C ++ - PullRequest
1 голос
/ 09 марта 2020

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

Запись int array[2048] = { DEFAULT_VALUE };

заполнит весь массив по умолчанию, и

int array[2048] = { [4] = VALUE_1, [123] = VALUE_2, [2047] = VALUE_3 };

установит указанные c индексы, а остальные равны нулю (это в глобальном пространстве), но как я могу инициализировать массив, чтобы указать c значения И мое собственное значение по умолчанию? Могу ли я написать свою собственную процедуру инициализации?

Между прочим, скорость является приоритетом.

Ответы [ 4 ]

1 голос
/ 09 марта 2020

Если вы не возражаете против динамического распределения памяти c, я бы просто использовал std::vector как

std::vector<int> array(2048, DEFAULT_VALUE);
array[4] = VALUE_1;
array[123] = VALUE_2;
array[2047] = VALUE_3;

, который довольно хорошо оптимизируется в этом живом примере

0 голосов
/ 09 марта 2020

Вы можете использовать std::valarray:

std::valarray<int> v(DEFAULT_VALUE, 2048);
v[std::_Sizarray{ 4, 123, 2034 }] = { VALUE_1, VALUE_2, VALUE_3 };
0 голосов
/ 09 марта 2020

Я решил проблему, смешав c и c ++ в своей программе. Я использовал "extern C", где это уместно. Используя C, я могу написать:

int array[256] = { [0 ... 255] = DEFAULT_VALUE, [4] = VALUE_1 };

, чтобы установить для всего массива мое собственное значение по умолчанию, если не указано иное. Мне нравится чистый код, поэтому переключение на C для этой функции сработало для меня. Векторы и куча не являются опциями, так как этот код будет работать во встроенной системе.

0 голосов
/ 09 марта 2020

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

При этом не существует чистого синтаксиса для этого. Просто установите значения из разумной процедуры инициализации самостоятельно. Это то, что компилятор будет делать в любом случае.

Также рассмотрите возможность использования std::array или std::vector.

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