Интервальное ветвление

Проект (C ++ 11), над которым я работаю, включает в себя блок кода, который будет выполняться где-то триллионы раз. У меня есть целочисленный параметр B в [1, N] и точки 1 = b1 < Би 2 < … < bk = N, где код выполняет другой небольшой блок кода в зависимости от того, в каком интервале [bi, b (i + 1)) B лежит. Единственное значение, которое изменяется во время выполнения, — это B. Однако, хотя значения bi являются исправлено, они определяются только во время выполнения.

Наивно можно написать несколько операторов if и else if, что в худшем случае включает k сравнений. Однако это можно сделать за постоянное время: построить вектор myGotos размера N и на каждом интервале [bi, b (i + 1)) сохранить местоположение соответствующего кодового блока. Тогда вы просто идете в myGotos [B].

Приведенное выше решение мне кажется, что в среднем это будет быстрее, но код будет довольно уродливым. Мне было интересно, есть ли лучший способ сделать это.

-1

Решение

Обычный способ сделать это с помощью оператора switch

switch(B){
case b1:..//
break;
}

Если вы можете объявить эти разделы кода как lambdas или std :: function, при условии, что они принимают одинаковые аргументы. Даже шаблонная функция может быть в порядке. Трудно ответить, не зная, что вам на самом деле нужно для запуска этих функций.

map<int,decltype(yourLambda)>

Похоже, это будет работать нормально.

1

Другие решения

Инициализировать массив N слоты, пусть Kгде каждый слот содержит индекс содержащего интервала.

затем

switch (K[B])
{
case 1: // [B1,B2)
...
}
1