Закралось, тут у меня сомнения относительно производительности операций создания и заполнения векторов, решил провестий простой тест, код ниже. Результаты несколько меня удивили:
В Debug-mode:
The above code block-1 was executed in 0.0500 second(s)
The above code block-2 was executed in 44.5400 second(s)
В Realese-mode:
The above code block-1 was executed in 0.0440 second(s)
The above code block-2 was executed in 0.1030 second(s)
Каждый тест запускался по 10 раз, отображены средние результаты.
#include <windows.h>
#include <time.h>
#include <iostream>
#include <vector>
HANDLE gHeap;
int _tmain(int argc, _TCHAR* argv[])
{
gHeap = HeapCreate(0,6553,65530);
int test[1000]={0};
clock_t start = clock();
for (int i=0;i<100000;i++){
int* var1 = (int*)HeapAlloc(gHeap,0,1000);
memcpy(var1, &test[0], 1000);
int* var2 = (int*)HeapAlloc(gHeap,0,900);
memcpy(var2, &var1[99], 900);
HeapFree(gHeap,0,var1);
memcpy(&test[99], var2, 900);
HeapFree(gHeap,0,var2);
}
clock_t stop = clock();
printf("The above code block-1 was executed in %.4f second(s)n", ((double) stop - start) / ((double) CLOCKS_PER_SEC));
start = clock();
for (int i=0;i<100000;i++){
std::vector<int> var3(1000);
memcpy(&var3[0], &test[0], 1000);
std::vector<int> var4(var3);
memcpy(&test[99], &var4[99], 900);
}
stop = clock();
printf("The above code block-2 was executed in %.4f second(s)n", ((double) stop - start) / ((double) CLOCKS_PER_SEC));
HeapDestroy(gHeap);
//getchar();
return 0;
}
Стандартная библиотека языка C++ предоставляет контейнер std::vector
, который является динамическим массивом и обладает рядом преимуществ по сравнению с обычным массивом C.
- Гибкость размера: Вектор
std::vector
может изменять свой размер динамически, а это означает, что он может быть увеличен или уменьшен по мере необходимости, что делает его более гибким в управлении памятью. В то время как обычный массив C имеет фиксированный размер и его необходимо изменять вручную, выделяя или освобождая память.
- Удобство использования: Вектор предоставляет различные методы и функции для работы с элементами, такие как
push_back
, pop_back
, insert
, erase
и другие. Это делает его более удобным для добавления, удаления и изменения элементов массива, в то время как для обычного массива C требуется больше усилий для выполнения этих операций.
- Безопасность: Вектор
std::vector
автоматически управляет памятью, что уменьшает вероятность ошибок при работе с памятью, таких как переполнение буфера или утечка памяти. В обычном массиве C отсутствует автоматическое управление памятью, и ошибки в управлении памятью могут привести к серьезным проблемам безопасности.
- Итераторы и алгоритмы: Вектор поддерживает использование итераторов и стандартных алгоритмов STL, что делает его удобным для применения различных операций и алгоритмов над элементами. Это улучшает читаемость и поддерживаемость кода.
- Производительность: Вектор
std::vector
обеспечивает производительность, сравнимую с обычным массивом C в большинстве случаев, а иногда даже лучше благодаря внутренней оптимизации и использованию эффективных алгоритмов.
Однако стоит отметить, что есть ситуации, когда использование обычного массива C может быть предпочтительным из-за своей простоты и предсказуемости поведения. В целом, выбор между вектором std::vector
и обычным массивом C зависит от конкретных требований проекта и удобства использования.