Сравнение производительности между тремя способами чтения и хранения массива объектов - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь улучшить свои навыки кодирования в решении проблем с использованием C ++. Поэтому мне любопытно узнать, какой из следующих трех предложенных примеров является более быстрым и лучшим в использовании, а также наилучшим способом оценки производительности.

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5;

struct Car {
    int id, price;
    Car(int _id, int _price) : id(_id), price(_price) {}
};

struct Boat {
    int id, price;
};

struct Motorcycle {
    int id, price;
};

int main() {
    // ------------ section1 ------------
    int n1;
    scanf("%d", &n1);
    vector<Car> cars;
    for (int i = 0; i < n1; i++) {
        int id, price;
        scanf("%d%d", &id, &price);
        cars.emplace_back(id, price);
    }
    // ------------ section2 ------------
    int n2;
    scanf("%d", &n2);
    Boat boats[N];
    for (int i = 0; i < n2; i++) {
        int id, price;
        scanf("%d%d", &id, &price);
        boats[i] = {id, price};
    }
    // ------------ section3 ------------
    int n3;
    scanf("%d", &n3);
    vector<Motorcycle> motorcycles(n3);
    for (auto& motorcycle : motorcycles) {
        scanf("%d%d", &motorcycle.id, &motorcycle.price);
    }
    return 0;
}

Однако я считаю, что обычный массив быстрее чем std::vector.

1 Ответ

1 голос
/ 19 апреля 2020

Самый быстрый и безопасный способ доступа к векторному контенту, который я знаю, - это сначала выделить хранилище (никогда не используйте push_back). И в зависимости от вашего компилятора: повторное использование основного выделенного указателя для доступа к данным: это использование аналогично разделу 2, но может использовать динамически размещенный контейнер

struct Boat {
    int id, price;
};



int main(int)
{
    int n = 10; // whatever dynamic variable
    std::vector<Boat> boats;
    boats.resize(n);
    auto boats_ptr = boats.data();

    for (auto i=0;i<boats.size();i++)   
    {
        *boats_ptr = { i,2*i}; // or any other construction
        boats_ptr++;
    }
}
...