Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Yejom's Dev Log

[C++ 입문] 4. vector, execution time 본문

Smart Factory Bootcamp

[C++ 입문] 4. vector, execution time

Yejom 2024. 4. 26. 20:16
  • 벡터 (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);

	}
}