Интервальное ветвление
Проект (C++11), над которым я работаю, включает в себя блок кода, который будет выполняться где-то триллионы раз. У меня есть целочисленный параметр B в [1,N] и точки 1 = b1 Наивно можно написать несколько операторов if и else if, что в худшем случае включает k сравнений. Однако это можно сделать за постоянное время: построить вектор myGotos размера N и на каждом интервале [bi, b(i+1)) сохранить местоположение соответствующего кодового блока. Тогда вы просто идете в myGotos[B]. Приведенное выше решение мне кажется, что в среднем это будет быстрее, но код будет довольно уродливым. Мне было интересно, есть ли лучший способ сделать это.
2 ответа
Обычный способ сделать это с помощью оператора switch
switch(B){
case b1:..//
break;
}
Если вы можете объявить эти разделы кода как lambdas или std::function, при условии, что они принимают одинаковые аргументы. Даже шаблонная функция может быть в порядке. Трудно ответить, не зная, что вам на самом деле нужно для запуска этих функций.
map<int,decltype(yourLambda)>
Похоже, это будет работать нормально.
Инициализировать массив N
слоты, пусть K
где каждый слот содержит индекс содержащего интервала.
затем
switch (K[B])
{
case 1: // [B1,B2)
...
}