Я пишу конструктор, который будет переносить элементы из списка 2D-инициализатора, объявленного как initializer_list<initializer_list<T>> myInitializerList
, в одномерный нормальный массив, объявленный как T * arr
(это будет хранить элементы в главном порядке строк).У меня есть два вложенных цикла for
для перебора списков инициализатора, но я пытаюсь оптимизировать тестовые выражения в каждом цикле for
(второй из трех операторов в объявлении цикла).
IУ меня есть пара идей, как это сделать, но я не уверен, что будет быстрее.Первый - сравнить итераторы и создать тестовое выражение для внешнего цикла rowItr != myInitializerList.end()
и для внутреннего цикла colItr != rowItr->end()
.
Моя вторая идея заключается в сравнении индексов, а не итераторов, и это может быть быстрее (хотяЯ не уверен).Ниже приведен полный цикл, демонстрирующий, как я реализовал вторую стратегию:
template <typename T> //a numerical type
//intentionally left out constructor definition, variable initialization
for (unsigned currentPosition{ 0 }; currentPosition < numRows*numCols; rowItr++) {
typename initializer_list<T>::iterator colItr = rowItr->begin();
for (unsigned currentColumn{ 0 }; currentColumn++ < numCols; colItr++) {
arr[currentPosition++] = *colItr;
}
}
//end constructor definition
Массивы будут хранить числовые типы, скорее всего, float
и иметь размеры до 1024x1024
.
Исходя из этих ограничений, один метод быстрее другого?В качестве альтернативы, есть третий алгоритм, который я не учел, который будет быстрее, чем оба, которые у меня уже есть?