Как инициализировать массив двойников в С++?

Я понял, что в С++ я не могу инициализировать массив double с помощью memset. Для целочисленного массива я могу легко инициализировать массив, используя:

int* a = new int[n];
memset(a, n*n, n*sizeof(int));

Но как я могу инициализировать массив двойников в С++?

long double* d = new long double[n];
memset(d, n*n, n*sizeof(long double)); // does not work

person orezvani    schedule 02.10.2014    source источник
comment
Попробуйте std::fill   -  person Nemo    schedule 02.10.2014
comment
Почему бы не использовать универсальный синтаксис инициализации? auto x = new T[N]{}; тем не менее, это хорошо, только если вы хотите инициализировать нулями...   -  person Deduplicator    schedule 02.10.2014
comment
@Nemo fill используется для std::arrray, используется ли он для моих массивов в стиле c?   -  person orezvani    schedule 02.10.2014
comment
@Deduplicator: потому что он пытается инициализировать ненулевое значение.   -  person Benjamin Lindley    schedule 02.10.2014
comment
@Deduplicator: это не позволяет вам указать значение для инициализации элементов.   -  person Remy Lebeau    schedule 02.10.2014
comment
std::fill будет работать с любым итерируемым контейнером. Так что std::fill(d, d+n, n*n) должен делать то, что вы хотите   -  person Nemo    schedule 02.10.2014
comment
@Deduplicator Синтаксис не ограничивается инициализацией по умолчанию. Вы также можете сделать new double[n]{42}.   -  person 5gon12eder    schedule 02.10.2014
comment
@ 5gon12eder: Конечно, но только для тех элементов, которые вы указываете во время компиляции.   -  person Deduplicator    schedule 02.10.2014
comment
@Nemo, я думаю, c++ 11 должен быть включен, я пытаюсь это сделать;)   -  person orezvani    schedule 02.10.2014
comment
std::fill существует с C++98 с той же семантикой. И большинство компиляторов оптимизируют его довольно хорошо.   -  person Nemo    schedule 02.10.2014
comment
@Nemo, использующий g++, должен быть включен с параметром -std=c++11 или -std=gnu++11. Но это сработало. Ваше здоровье   -  person orezvani    schedule 02.10.2014
comment
@Deduplicator Я снова кое-что узнал. ;-)   -  person 5gon12eder    schedule 02.10.2014
comment
@Немо, есть ли другой вариант? потому что кажется, что на моей тестовой машине нет ни одного из С++ 11 и gnu ++ 11 (и, очевидно, я не могу их установить)   -  person orezvani    schedule 04.10.2014
comment
@emab: Опять же, std::fill был в стандарте C++ с тех пор, как исходный стандарт был ратифицирован в 1998 году. Если вам кажется, что вам нужен C++11, вы делаете что-то не так ... Например, вы не забыли #include <algorithm>? Если вы можете опубликовать короткую тестовую программу в другом вопросе, который не работает, кто-нибудь обязательно поможет вам это исправить.   -  person Nemo    schedule 04.10.2014


Ответы (1)


memset(a, n*n, n*sizeof(int));

Это, вероятно, не делает то, что вы ожидаете. В документе говорится, что параметр значения преобразуется в беззнаковый символ. Каждому байту будет присвоено это значение. Когда вы посмотрите на 4 или 8 байтов, составляющих int, вы получите мусор. Единственное полезное значение, которое я видел, это 0. Это также сработает для инициализации двойного

Единственный способ инициализировать массив числовых значений известным значением, например 42, — это написать цикл

person KC-NH    schedule 02.10.2014
comment
Это также сработает для создания двойника - не в переносимом коде. Спецификация позволяет представлять 0.0 способами, отличными от нуля. - person Nemo; 02.10.2014
comment
Вам не нужно писать цикл. Используйте 1_ - person Neil Kirk; 02.10.2014
comment
Все известные мне современные архитектуры ЦП используют IEEE с плавающей запятой, для которой все нулевые байты являются представлением 0.0. Я знаком со старым форматом VAX, но он также использовал все нулевые байты для представления 0.0. Хотя спецификация допускает другие архитектуры, я не беспокоюсь об этом. - person KC-NH; 02.10.2014