Когда есть вложенные циклы, как мне решить, какой цикл должен быть вложенным? - PullRequest
0 голосов
/ 08 октября 2019

Я наткнулся на некоторый код, который имеет вложенные циклы: есть список файлов измерений, содержащий список измерений. Каждые измерения необходимо сравнить со списком контрольных измерений, чтобы выполнить некоторые проверки.

Вот краткий пример.


class Measurement {
public:
    bool operator==(const Measurement& other) { return isEqual(other); }

private:
    bool isEqual(const Measurement& other) const;

    /* some private fields */
};

class MeasurementFile
{
public:
    std::vector<Measurement> measurements;
};

int main()
{
    std::vector<Measurement> referenceMeasurements = createReferenceMeasurements();
    std::vector<MeasurementFile> files = createMeasurementFiles();

    for (auto & singleFile : files) {
         for (auto & singleMeasurement : singleFile.measurements) {
              for (auto & reference : referenceMeasurements) {
                   if (reference == singleMeasurement) {
                        doSomething(singleMeasurement);
                   }
              }
         }
    }
    return 0;
}

Основное также можно записать так:

int main()
{
    std::vector<Measurement> referenceMeasurements = createReferenceMeasurements();
    std::vector<MeasurementFile> files = createMeasurementFiles();

    for (auto & reference: referenceMeasurements) {
         for (auto & singleFile : files) {
              for (auto & singleMeasurement : singleFile.measurements) {
                   if (reference == singleMeasurement) {
                        doSomething(singleMeasurement);
                   }
              }
         }
    }
    return 0;
}

Итак, мой вопрос: между двумя вышеупомянутыми решениями, которое является лучшим (если оно есть)? Это только вопрос предпочтений?

1 Ответ

1 голос
/ 08 октября 2019

Обычно порядок петель зависит от частоты и порядка доступа. Вы правы, что это может быть написано в любом случае, но реально первый вариант был бы лучше, и вы бы меньше загружали из памяти и имели бы лучшее повторное использование кэша.

Использование auto & будетявным образом попросите компилятор не делать копии (у вашего оригинала не было бы &; без него вы бы воссоздали бы объект singleFile много раз, без необходимости. Первый вариант значительно уменьшает это. При этом первыйОпция по-прежнему будет лучше для повторного использования, максимально используя singleFile.

...