Notice
Recent Posts
Recent Comments
Link
Yejom's Dev Log
[C++ 입문] 4. vector, execution time 본문
- 벡터 (vector)
자동으로 메모리를 할당해주는 배열
#include <vector> // vector 헤더파일을 추가해야 사용 가능
vector<int> v = { 1,2,3,4,5 };
vector<int> v(4); //int형 백터 생성 후 크기를 4로 할당(모든 백터요소 0으로 초기화)
vector<int> v(5, 1); //int형 백터 생성 후 크기를 5로 할당(모든 백터요소 1로 초기화)
int value = v[2]; // 벡터의 3번째 요소의 값을 value로 가져옴
v[3] = 100; // 벡터의 4번째 요소에 값을 복사
v.assign(5, 1); //0~4인덱스의 값을 1로 초기화
- .at(인덱스) : 인덱스에 해당하는 값 반환
- .front() : 벡터의 첫번째 요소 접근
- .back() : 벡터의 마지막 요소 접근
- .resize(int) : 입력 정수 만큼 백터의 크기를 확보하고 초기화
- .reserve(int) : 입력 정수 만큼 백터의 크기를 예약
- .size() : 벡터가 사용중인 크기를 반환
- .capacity() : 벡터가 예약된 크기를 반환
- .push_back(value) : 벡터의 제일 마지막에 원소를 삽입
- .pop_back() : 벡터의 마지막 부분 제거
- ==> push_back(value)을 여러번 사용하는 것 보다, reserve(int)로 미리 크기를 지정하는 것이 더 빠름.
- .begin() : 벡터 시작점의 iterator 반환
- .insert(v.begin()+3, 원소); : 3번 인덱스에 원소를 삽입
- .erase(시작 iterator, 마지막 iterator) : 시작 위치부터 마지막 위치 전까지의 원소를 삭제
- ==> v.erase(v.begin() + 1, v.begin() + 3); : 벡터 v의 1 ~ 2번 인덱스 삭제
- .clear() ; 벡터의 모든 요소를 지움
- vector 실습 (벡터 내장 함수)
#include <iostream>
#include <string>
#include <vector>
#define SIZE 5
using namespace std;
void Input_Add_Vector(vector<int> &vec);
int Vec_Size(vector<int>& vec);
void Print_Vec(vector<int>& vec);
int Get_Double(int x);
void Erase_Vec(vector<int>& vec);
void Push_Num_to_Vec(vector<int>& vec);
int main() {
// 1. 벡터 선언
vector<int> my_vec;
// 2. SIZE 개의 정수를 입력받아 벡터에 추가하는 함수 호출
Input_Add_Vector(my_vec);
// 3. 벡터의 크기 출력 & 할당
int my_vec_size = Vec_Size(my_vec);
///////////////////////////////////////////////////////////
// 4. 벡터의 모든 원소 출력
cout << endl << "벡터에 있는 원소는 ";
Print_Vec(my_vec);
///////////////////////////////////////////////////////////
// 5. 가장 큰 값을 찾기 & 출력
cout << endl << "가장 큰 값은 " << *max_element(my_vec.begin(), my_vec.end()) << endl;
///////////////////////////////////////////////////////////
// 6. 벡터의 모든 원소를 두배로
for (int i = 0; i < my_vec_size; i++) {
my_vec[i] = Get_Double(my_vec[i]);
}
// 벡터의 모든 원소 출력
cout << endl << " ===> 모든 값 2배 후 원소들의 값: ";
Print_Vec(my_vec);
///////////////////////////////////////////////////////////
// 7. 인덱스를 입력받아 해당 인덱스에 있는 원소 제거
Erase_Vec(my_vec);
// 벡터의 모든 원소 출력
cout << endl << " ===> 제거 후 원소들의 값 : ";
Print_Vec(my_vec);
///////////////////////////////////////////////////////////
// 8. 인덱스를 입력받아 해당 인덱스에 있는 새로운 원소 삽입
Push_Num_to_Vec(my_vec);
// 벡터의 모든 원소 출력
cout << endl << " ===> 추가 후 원소들의 값 : ";
Print_Vec(my_vec);
}
// 2
void Input_Add_Vector(vector<int> &vec) {
for (int i = 0; i < 5; i++) {
int num;
cout << " Q. 벡터에 추가할 " << i + 1 << "번째 정수를 입력하시오. (총 " << SIZE << "개 입력)" << endl;
cin >> num;
vec.push_back(num);
}
}
// 3
int Vec_Size(vector<int>& vec) {
int my_vec_size = vec.size();
cout << "벡터의 크기는 " << my_vec_size << endl;
return my_vec_size;
}
// 4
void Print_Vec(vector<int>& vec) {
for (int num : vec) {
cout << num << " ";
}
cout << endl;
}
// 6
int Get_Double(int x) {
return x * 2;
}
// 7
void Erase_Vec(vector<int>& vec) {
int idx = 0;
cout << endl << " Q. 제거를 원하는 값의 인덱스를 입력하시오. ( 0 ~ " << vec.size() - 1 << " 사이의 값 입력 ) : ";
cin >> idx;
vec.erase(vec.begin() + idx);
}
// 8
void Push_Num_to_Vec(vector<int>& vec) {
int idx;
int num;
cout << endl << " Q. 추가를 원하는 값의 인덱스를 입력하시오. ( 0 ~ " << vec.size() << " 사이의 값 입력 ) : ";
cin >> idx;
cout << endl << " Q. 추가를 원하는 값을 입력하시오. : ";
cin >> num;
vec.insert(vec.begin() + idx, num);
}
- v[2] 와 .at(2)의 차이?
=> 벡터는 크기가 유동적임. 인덱스가 존재하는지부터 확인해주는 게 .at(인덱스) - for 문에서 딱 한줄만 실행할 경우 { } 중괄호 생략 가능.
- vector 실습 (중복 제거)
#include <iostream>
#include <vector>
#include <string>
#include <algorithm> // sort와 unique 사용
using namespace std;
int main() {
vector<int> myVector = { 10, 20, 30, 20, 40, 10, 50 };
cout << "[vector]" << endl;
// 초기 벡터 원소 출력
for (int vec : myVector) cout << vec << " ";
sort(myVector.begin(), myVector.end()); // 무조건 sort해줘야 함. unique가 연속되는 중복만 제거하기 때문.
myVector.erase(unique(myVector.begin(), myVector.end()), myVector.end());
// unique 함수 사용 후 중복 원소가 뒤로 감.
// 첫 중복 원소의 주소값을 리턴.
// ex) 5, 6 번째 원소가 중복인 원소라면 5번부터 마지막 원소까지 지워짐.
cout << endl << "[vector 중복삭제]" << endl ;
// 중복 원소 제거 후 출력
for (int vec1 : myVector) cout << vec1 << " ";
}
- 벡터 성능 체크 (measure execution time)
#include <iostream>
#include <time.h>
#include <vector>
using namespace std;
#define REPEAT 100000000
void PushHM(vector<int> vec);
int main() {
time_t start, end;
double result1, result2;
vector<int> test_vec1(1);
start = clock(); //현재 시간 반환
PushHM(test_vec1);
end = clock();
result1 = (double)(end - start);
cout << "test_vec1의 수행 시간 : " << result1 << " millisecond" << endl;
////////////////////////////////////////////////////////////////
vector<int> test_vec2(1);
test_vec2.reserve(REPEAT);
start = clock(); //현재 시간 반환
PushHM(test_vec2);
end = clock();
result2 = (double)(end - start);
cout << "test_vec2의 수행 시간 : " << result2 << " millisecond" << endl;
//cout << "수행 시간 : " << ((result) / CLOCKS_PER_SEC) << " second" << endl;
return 0;
}
void PushHM(vector<int> vec) {
for (int i = 0; i < REPEAT; i++) {
vec.push_back(i + 1);
}
}
'Smart Factory Bootcamp' 카테고리의 다른 글
[C++ 입문] 6. file separation, namespace (0) | 2024.05.09 |
---|---|
[C++ 입문] 5. list, string (0) | 2024.04.30 |
[C++ 입문] 3. pointer, dynamic array (0) | 2024.04.26 |
[C++ 입문] 2. loop, function, array (0) | 2024.04.24 |
[C++ 입문] 1. variable, operator, condition (0) | 2024.04.24 |