Я полностью согласен с утверждениями, которые ребята разместили выше. Но как лучше узнать что-то новое? Привет!!!! конечно, не читая текст и не выучив наизусть, но .... ПРИМЕРЫ: D Поскольку я недавно погрузился в контейнеры, указанные в STL, вот быстрый тестовый код, который не требует пояснений, я надеюсь:
#include <iostream>
#include <vector>
#include <deque>
#include <array>
#include <list>
#include <iterator>
#include <cstdlib>
#include <algorithm>
#include "Timer.h"
constexpr int SIZE = 1005000;
using namespace std;
void test();
int main(){
cout<<"array allocates "<<static_cast<double>(SIZE)/(1024*1024)<<" MB\n";
test();
return 0;
}
void test(){
int values[SIZE];
int size = 0;
//init values to sort:
do{
values[size++] = rand() % 100000;
}while(size < SIZE);
//feed array with values:
array<int, SIZE> container_1;
for(int i = 0; i < SIZE; i++)
container_1.at(i) = values[i];
//feed vector with values
vector<int> container_2(begin(values), end(values));
list<int> container_3(begin(values), end(values));
deque<int> container_4(begin(values), end(values));
//meassure sorting time for containers
{
Timer t1("sort array");
sort(container_1.begin(), container_1.end());
}
{
Timer t2("sort vector");
sort(container_2.begin(), container_2.end());
}
{
Timer t3("sort list");
container_3.sort();
}
{
Timer t4("sort deque");
sort(container_4.begin(), container_4.end());
}
}
И код для таймера:
#include <chrono>
#include <string>
#include <iostream>
using namespace std;
class Timer{
public:
Timer(string name = "unnamed") : mName(name){ mStart = chrono::system_clock::now();}
~Timer(){cout<<"action "<<mName<<" took: "<<
chrono::duration_cast<chrono::milliseconds>(
chrono::system_clock::now() - mStart).count()<<"ms"<<endl;}
private:
chrono::system_clock::time_point mStart;
string mName;
};
Вот результат, когда оптимизация не используется ( g ++ --std = c ++ 11 file.cpp -o a.ou t):
массив выделяет 0,958443 МБ
Массив сортировки действий занял: 183 мс
вектор сортировки действия занял: 316мс
список сортировки действий занял: 725мс
deque action deque: 436ms
и с оптимизацией ( g ++ -O3 --std = c ++ 11 file.cpp -o a.out ):
массив выделяет 0,958443 МБ
Массив сортировки действий занял: 55мс
вектор сортировки действия занял: 57ms
список сортировки действий занял: 264мс
deque action deque: 67ms
Обратите внимание, что хотя вектор и массив имеют одинаковую сортировку по времени для этого случая, размер массива ограничен, так как предполагается, что он инициализируется в стеке (по умолчанию, без использования собственных распределителей и т. Д.)
Так что это зависит также от того, используете ли вы оптимизацию для компилятора, если нет, мы можем увидеть заметную разницу.