멈추지 않고 끈질기게
[C++][메모용] reserve() vs resize() / 시간 측정(std::chrono) 본문
※ 해당 포스팅은 개인의 공부 정리용 글입니다. 틀린 내용이 있다면 추후 수정될 수 있습니다.
※ 해당 포스팅은 하기 출처들을 참조하였습니다.
- https://stackoverflow.com/questions/7397768/choice-between-vectorresize-and-vectorreserve
- https://m.blog.naver.com/jeann/222135392649
1. reserve() vs resize()
- vector<T> 클래스에 존재하는 함수
- reserve()는 단어 의미 그대로 원소를 넣을 공간을 예약하는 함수로, capacity를 전달한 값으로 늘림
즉, 실제 원소 갯수는 변하지 않음
- 현재 capacity보다 작은 값을 넣을 경우, 아무 일도 일어나지 않음
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec{ 1, 2, 3, 4, 5 };
vec.reserve(10);
for (const int n : vec)
cout << n << " ";
cout << endl;
cout << "벡터의 size: " << vec.size() << "\n";
cout << "벡터의 capacity: " << vec.capacity() << "\n";
vec.reserve(5);
for (const int n : vec)
cout << n << " ";
cout << endl;
cout << "벡터의 size: " << vec.size() << "\n";
cout << "벡터의 capacity: " << vec.capacity() << "\n";
}
- resize()의 경우 실제 원소 갯수를 전달한 값으로 증가시킴
capacity가 부족하다면 당연히 원소 수에 맞춰서 증가시키고, 해당 자료형의 기본값이 들어감
- 현재 원소 갯수보다 작은 값을 넣을 경우, 해당 갯수만큼만 남기고 원소 삭제(capacity는 변동 없음)
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec{ 1, 2, 3, 4, 5 };
vec.resize(10);
for (const int n : vec)
cout << n << " ";
cout << endl;
cout << "벡터의 size: " << vec.size() << "\n";
cout << "벡터의 capacity: " << vec.capacity() << "\n\n";
vec.resize(3);
for (const int n : vec)
cout << n << " ";
cout << endl;
cout << "벡터의 size: " << vec.size() << "\n";
cout << "벡터의 capacity: " << vec.capacity() << "\n";
}
- 또한, 클래스 타입의 벡터일 경우 해당 클래스의 생성자를 호출함
예를 들어 resize()를 통해 3개의 원소를 추가했다면 생성자가 3번 호출됨
#include <iostream>
#include <vector>
using namespace std;
class Test
{
public:
Test() { cout << "기본 생성자 호출!\n"; }
};
int main()
{
vector<Test> vec;
vec.resize(3);
}
2. 시간 측정(std::chrono)
- 코드 실행 시간을 측정하는 데 사용하기 편리한 네임스페이스로 std::chrono가 있음(C++ 11 이상)
- chrono 헤더 포함 필수(#inlcude <chrono>)
- 이하의 함수들은 std::chrono:: 를 붙여야 하므로 번거롭다면 using namespace 사용
#include <iostream>
#include <chrono>
using namespace std;
using namespace chrono;
- system_clock::now() 함수를 통해 현재 시간을 기록할 수 있음
- 상기 함수를 호출하여 기록되는 시간은 기본 nano seconds 단위이나, duration_cast<milliseconds>() 함수를 통해
ms 단위로 변환 가능
- (종료 시간 - 시작 시간) 값의 count() 함수를 출력하면 실제 실행 시간을 출력 가능
int main()
{
// 시작 시간 기록
time_point<system_clock> start = system_clock::now();
// 시간 측정용 코드
int n = 0;
for (int i = 0; i < 10000; ++i)
for (int j = 0; j < 10000; ++j)
n = i + j;
// 종료 시간 기록
auto end = system_clock::now();
// 최종 실행 시간 출력
auto time_gap = std::chrono::duration_cast<milliseconds>(end - start);
cout << "코드 실행 시간: " << time_gap.count() << "ms\n";
}
'C++' 카테고리의 다른 글
[C++][메모] 옛날 문법 정리 (1) | 2024.11.03 |
---|---|
[C++][메모용] map 관련 정리 (0) | 2024.08.01 |
[C++] std::endl vs "\n" (2) | 2024.07.23 |
[C++] 람다 표현식(lambda expression) (0) | 2023.12.05 |
[C++] 스마트 포인터(Smart Pointer) (0) | 2023.11.23 |