У меня есть код, где я использую две разные функции для 2D
и 3D
. В цикле for
по списку координат я бы хотел вызвать функции соответственно, проверив dimensions
. Тем не менее, проверка размера с if
для каждой координаты очень неэффективна, так как проверка размера требуется только один раз (в начале кода).
Для вашей информации функции 2D/3D functions
находятся в отдельном файле, а затем список координат находится в отдельном файле.
Может ли кто-нибудь предложить эффективный способ вызова соответствующей функции, используя только одну проверку в начале кода для dimensions
?
Псевдокод: file1.cpp
readcoordinates(); //store the coordinates info;
for(number of coordinates)
checkfunction(coordinates[i]); //function in file2.cpp
file2.cpp
checkfunction(coordinates[i]){
//requires dimension info here for complicated checking,
// which cannot be explained here.
// Since entire list of coordinates is same dimension, multiple if checks can be avoided here
}
Сделайте число измерений параметром шаблона. Это позволяет избежать дублирования кода, но компилятор избавится от ВСЕХ проверок размеров, создав версию кода для 2-D и отдельную для 3-D, оба получаются полностью оптимизированными.
Вы не можете предоставить параметры шаблона во время выполнения, поэтому вам нужна функция отправки, которая динамически проверяет измерение, один раз и вызывает либо экземпляр шаблона 2-D, либо 3-D.
Альтернативой if
else
или switch
функции отправки является использование виртуальной диспетчеризации (каждая виртуальная реализация затем вызывает правильное создание шаблона для выполнения фактической работы).
В большинстве ситуаций, подобных этому, ключ состоит в том, чтобы прекратить доступ к вашим элементам через список всех элементов. Списки не поддерживают порядок, и это ограничивает вас большим количеством проверок, чтобы узнать, нуждается ли элемент в обработке.
Например, вы можете использовать дерево элементов, а затем ноль в первом элементе в нужном диапазоне по оси X и последний элемент в пределах требуемого диапазона по этой оси X и обрабатывать все элементы "между ними". При таком решении вы могли бы поддерживать два упорядоченных дерева, для оси X и одну для оси Y.
Или вы можете построить структуру данных на основе методов Geo-Hashing.
В любом случае вы можете быстро отфильтровать элементы по координатам, а затем передать их другим подпрограммам, которые не выполняют какую-либо фильтрацию на основе координат (полагая, что фильтрация извне правильная).
В дополнение к другим предложениям (и предполагая, что вы используете их для какой-либо 2D-3D-математики), вы также можете просто рассматривать все как 3D-вектор (2D-векторы будут иметь только 0 для Z-координаты). Затем вы выполняете только одну функцию, независимо от того, сколько координат у вас есть в вашей структуре.