Создайте массив помощника с равными ключами и значениями от эквидистантной антенной решетки

Удивлен, что еще никто не опубликовал версию C ++ без веток и типов:

template <typename T> int sgn(T val) {
    return (T(0) < val) - (val < T(0));
}

Преимущества:

  • На самом деле реализует signum (-1, 0 или 1) , Реализации здесь, использующие copysign, только возвращают -1 или 1, что не является signum. Кроме того, некоторые реализации здесь возвращают float (или T), а не int, что кажется расточительным.
  • Подходит для целых чисел, чисел с плавающей запятой, двойных чисел, шорт без знака или любых пользовательских типов, которые можно создать из целого числа 0 и заказать.
  • Быстро! copysign медленно, особенно если вам нужно продвинуться, а затем снова сузиться. Это не имеет ответвлений и отлично оптимизирует
  • Соответствие стандартам! Хак с бит-сдвигом аккуратен, но работает только для некоторых битовых представлений и не работает, когда у вас тип без знака. Это может быть предоставлено как ручная специализация, когда это уместно.
  • Точная! Простые сравнения с нулем могут поддерживать внутреннее высокоточное представление машины (например, 80 бит на x87) и избежать преждевременного округления до нуля.

Предостережения:

  • Это шаблон, поэтому его компиляция займет вечность.
  • Очевидно, некоторые люди считают более понятным использование новой, несколько эзотерической и очень медленной стандартной библиотечной функции , которая даже не реализует signum .
  • Часть < 0 проверки вызывает предупреждение -Wtype-limits GCC при создании экземпляра для типа без знака. Вы можете избежать этого, используя некоторые перегрузки:

    template <typename T> inline constexpr
    int signum(T x, std::false_type is_signed) {
        return T(0) < x;
    }
    
    template <typename T> inline constexpr
    int signum(T x, std::true_type is_signed) {
        return (T(0) < x) - (x < T(0));
    }
    
    template <typename T> inline constexpr
    int signum(T x) {
        return signum(x, std::is_signed<T>());
    }
    

    (что является хорошим примером первого предупреждения.)

75
задан Brett 2 April 2017 в 19:57
поделиться

3 ответа

Вы можете использовать функцию array_combine , например так:

$numbers = array('first', 'second', 'third');
$result = array_combine($numbers, $numbers);
158
ответ дан 24 November 2019 в 11:35
поделиться

Этот простой подход должен работать:

$new_array = array();
foreach($numbers as $n){
  $new_array[$n] = $n;
}

Вы также можете сделать что-то вроде :

array_combine (array_values ​​($ numbers), array_values ​​($ numbers))

4
ответ дан 24 November 2019 в 11:35
поделиться

Это должно сработать.

function toAssoc($array) {
    $new_array = array();
    foreach($array as $value) {
        $new_array[$value] = $value;
    }       
    return $new_array;
}
0
ответ дан 24 November 2019 в 11:35
поделиться
Другие вопросы по тегам:

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