Удивлен, что еще никто не опубликовал версию C ++ без веток и типов:
template <typename T> int sgn(T val) {
return (T(0) < val) - (val < T(0));
}
Преимущества:
copysign
медленно, особенно если вам нужно продвинуться, а затем снова сузиться. Это не имеет ответвлений и отлично оптимизирует Предостережения:
Часть < 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>());
}
(что является хорошим примером первого предупреждения.)
Вы можете использовать функцию array_combine
, например так:
$numbers = array('first', 'second', 'third');
$result = array_combine($numbers, $numbers);
Этот простой подход должен работать:
$new_array = array();
foreach($numbers as $n){
$new_array[$n] = $n;
}
Вы также можете сделать что-то вроде :
array_combine (array_values ($ numbers), array_values ($ numbers))
Это должно сработать.
function toAssoc($array) {
$new_array = array();
foreach($array as $value) {
$new_array[$value] = $value;
}
return $new_array;
}