Во-первых это не нормирование, т.к если в массиве числа в диапазоне [0.2 .. 1.0], то после такого нормирования они будут замаплены на диапазон [0..1], что неверно.
Только приведение к диапазону [0..1] и есть нормирование. Всё остальное по определению нормированием не является.
Во-вторых для массива единичной длины
И как же Вы собираетесь нормировать этот вырожденный случай?
Норма нуля по определению это 0, так как с точки зрения математики норма это расстояние точки от нуля в метрическом пространстве. Поэтому в результате нормирования ноль должен быть отображен на ноль, поскольку ноль это инвариант у операции "норма".
А где этот 0 на шкале? В случае температуры это ноль по Фаренгейту, Цельсию, или абсолютный? А в случае потенциала это потенциал Земли, корпуса устройства, Солнца, или может галактического ядра? А расстояние до ноля - это само число, для 100 это 100, а ни как не 1. Но есть величины размерные и безразмерные, нормированные величины - это безразмерные отклонения от минимума.
Кстати, то же самое будет если все элементы в массиве равны.
Тоже вырожденный случай, константу не нормируют.
чтобы передавать туда std::vector<double>
По условию у нас массив.
Ну и в третьих оно всегда читает первый элемент, даже у массива нулевой длины,
А ничего, что я предупредил о том, что функция не проверяет корректность параметров?
Ну и по стилю: непонятно зачем делать тип элемента шаблонным параметром, когда можно сделать таковым тип самой последовательности, чтобы передавать туда std::vector<double>, например.
Код: Выделить всё
template <typename t> void f(t Data)
{
// Ну ка определите здесь базовый тип для t в случае, когда t - тип массива?
}
Более того, линейный параметр-массив - это всегда просто указатель, чей sizeof определяется только разрядностью системы и определить даже количество элементов становится не возможно, так как sizeof(Data)/sizeof(Data[0]) не имеет смысла.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.