Самый эффективный способ перенести 2D initializer_list в 1D обычный массив в C ++ - PullRequest
0 голосов
/ 02 декабря 2018

Я пишу конструктор, который будет переносить элементы из списка 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.

Исходя из этих ограничений, один метод быстрее другого?В качестве альтернативы, есть третий алгоритм, который я не учел, который будет быстрее, чем оба, которые у меня уже есть?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...