-
C++ Vector개념 Self Study📝/C, C++ 2023. 8. 10. 13:16
1. Vector란?
- Vector(Queue)는 동적 배열 구조를 C++로 구현한 것으로 맨 끝에서만 삽입 및 삭제가 일어나는 구조이다.
일반 배열과 차이점이라면 동적으로 크기가 변하고 메모리가 연속적
- 자동으로 배열 크기 조절 가능
- 유연하게 객체의 추가 및 삭제가 가능하다
*중간데이터 삭제시 vector의 erase함수를 통해 삭제할 수 있다. => 삭제가 빈번할 경우 Linked List가 효율적이다.
>>Vector가 배열에 비해 성능은 떨어지지만 메모리를 효울적으로 관리하고 예외처리가 쉽다.
2. Vector의 헤더파일
- Vector을 사용하기 위한 헤더파일 >> #include<vector>을 포함해야한다.
- vector<데이터 타입> 변수명; 으로 vector을 선언한다. ex) vector <string> p;
3.Vector의 선언 방법
1)Vector의 크기를 정하지 않은 경우
vector<변수 타입> 변수명;
vector<int> p;
2)Vector의 크기를 정하는 경우
vector<변수 타입> 변수명(크기);
vectro<int> p(10); vector<string> p2(5);
3)Vector의 크기를 정하고 데이터를 초기화할 경우
vector<변수타입> 변수명(크기, 초기화 상수);
크기 10의 벡터에 1로 초기화 하는 예시)
vector<int>v(10,1);
4. Vector 멤버 함수
vector<int> v;
- 원소 접근
함수 설명 v[idx] v[idx] 형태로 idx번째의 원소를 참조한다. v.at(idx) 벡터 v의 idx번째 원소를 참조한다. v.front() 원소의 첫번째 원소를 참조한다. v.back() 원소의 마지막 원소를 참조한다. v.begin() iterator로 접근 시 vector의 맨 첫번째 데이터 위치를 가리킨다. v.end() iteratrot로 접근시 vector의 맨 마지막 데이터 위치의 다음을 가리킨다. v.rbegin() 백터의 끝 지점을 시작점으로 반환 v.rend() 벡터의 (시작 + 1) 지점을 끝 부분으로 반환 - 삽입/ 삭제
함수 설명 v.push_back(데이터) 벡터 v에 데이터 타입에 맞는 데이터(정수, 문자열, 문자 등등)를 맨끝에 삽입한다. v.pop_back() 벡터 v의 맨 끝 데이터를 삭제한다. v.insert(데이터 위치, 데이터) 벡터 v의 원하는 위치에 데이터를 삽입하고 싶은 경우 v.insert(2,3) 으로 선언한다. v.emplace(삽입할 위치의
주소 값, 변수 값)벡터의 마지막 부분에 새로운 요소 추가(move로 인해 복사 생성자 X) v.emplace_back() 백터의 마지막 부분에 새로운 요소추가(move로 인해 복사 생성자 X) v.erase(iter) 반복자인 iter를 통해 원소 위치에 접근하여 벡터 v의 데이터를 삭제한다. v.clear() 벡터의 모든 요소를 지운다.(return size = 0) v.resize(수정 값) 벡터의 사이즈를 조정한다.(범위 초과시 0으로 초기화) v.swap(벡터 변수) 벡터와 벡터를 스왑한다. ※ vector에 대한 복사생성자와 move
기본적으로 push_back()함수는 값을 넣는 과정에서 복사 생성자를 호출하게 된다. 뿐만 아니라 insert를 하게 되면 모든 값들을 새로운 메모리에 복사한 후 해당 자리에 값을 넣게 된다.
=> 이렇게 되면 복사생성자로 인한 오버헤드가 커지게 되며 성능 저하를 야기한다.
그러하여 나오게 된것이 emplace 와 emplace_back이다.>> 벡터 내부에서 값들을 생성하는 것이다.
#include <iostream> #include <vector> #include <string> class A { private: int num; std::string name; public: A(int i, std::string s) : num(i), name(s) {} }; int main(void) { std::vector<A> v; A a(1, "hwan"); v.push_back(1, "hi"); //error -> v.push_back(a); v.emplace_back(1, "hi"); //ok!! return 0; }
해당 코드를 확인해보면 push_back의 경우 내부적으로 템플릿에 대한 생성자 호출을 지원하지 않으므로 Error가 발생한다.
emplace를 사용하게 되면 내부적으로 템플릿에 대한 생성자를 호출해주기 때문에 복사생성자 없이 바로 입력이 가능해진다.
- 크기(사이즈) 함수
함수 설명 v.size() 현재 벡터 v의 원소 갯수(크기)를 리턴한다. v.capacity() 할당된 벡터의 원소 갯수(크기)를 리턴한다. v.empty() 벡터 v가 비었는지 확인한다. 비어있는 경우 true를 반환하고 비어있지 않는 경우 False를 반환 v.max_size() 벡터가 system에서 만들어 질 수 있는 최대 크기 반환 v.reserve(숫자) 벡터의 크기 설정 v.shrink_to_fit capacity의 크기를 벡터의 실제 크기에 맞춤 참고
https://hwan-shell.tistory.com/119
'개념 Self Study📝 > C, C++' 카테고리의 다른 글
Pair 클래스 (0) 2023.08.10 C++ Optional, varient, tuple (0) 2023.08.10 C++ 의 클래스 (0) 2023.08.03 C++ 참조자 및 짚고 갈 것 (2) 2023.08.02 구조체(Struct) (0) 2023.08.01