programming/C++

[C++] STL - Vector 정리

KoTiv 2021. 12. 27. 16:17
반응형
SMALL

2021.12.24 - [programming/C++] - [C++] STL Container 특징 과 String class

 

[C++] STL Container 특징 과 String class

STL(Standard Template Librate ) 란 ? C++ 템플릿을 이용한 표준으로 정리된 라이브러리로 구성요소로 반복자, 컨테이너, 알고리즘을 3가지 구성요소로 가지고있다. ** string 은 c++ 표준라이브러리로 STL에

hofe-rnd.tistory.com

2021.12.27 - [programming/C++] - [C++] STL - Array 정리

 

[C++] STL - Array 정리

2021.12.24 - [programming/C++] - [C++] STL Container 특징 과 String class [C++] STL Container 특징 과 String class STL(Standard Template Librate ) 란 ? C++ 템플릿을 이용한 표준으로 정리된 라이브러리..

hofe-rnd.tistory.com

Vector란 ?

Vector는 C++ STL(Standard Template Library)의 시퀀스 컨테이너로 사용자에게 효율적 편의성을 제공하기위해 정의된 Class이다.

Vector의 가장 큰 효율성은 Array STL의 고정배열 Class와 다르게 동적으로 원소를 추가하면 배열의 크기가 자동으로 늘어단다는 장점이 있다. 즉 가변적으로 배열의 크기가 변하는 동적 배열 이다. 

동적 배열의 특성으로 인해 1. 메모리 관리를 효율적으로 할수 있다는 장점이 있다.

속도적인 측면( 빠른 속도를 원하는 프로그램에 있어서)는 배열과 Array보다는 성능이 떨어지는 단점이 있기도 하다. 

 

[ * 정적인 배열은 배열의 길이가 Fixed되어 있어. 사용하지 않는 공간의 메모리 공간이 생겨 메모리 관리에 상대적으로 비효율적이다 C의경우 생각해본다면 malloc 하여 메모리를 할당하고 사용한 이후 free하여 메모리 공간을 늘려주는 방법으로 생각하면된다. ]

 

다시말하면 Vector는 배열과 마찬가지로 데이터 원소들은 하나의 메모리 블록에 연속하게 저장되는 구조를 가지고 있다.

즉 ** 빈번한 데이터 삽입 및 삭제가 발생하는 프로그램에서는 메모리 블록을 재할당 등의 이슈로 부하가 발생하게 되어 빈번하다면 비효율적이라는 이야기다.

 

Vector 자료형의 구조

front() / back () : 첫 번째/ 마지막 원소 

begin() / end () : 첫 번째 / 마지막 다음의 위치 

size () / capacity () : 원소의 개수 / 할당된 메모리 공간의 크기. 

 

. Vector는 앞쪽이 막혀 있는 자료이기 때문에 Head부분에서는 원소(Element)를 추가및 삭제를 할 수 없는 구조이다. 

즉 Element(원소)를 추가/삭제 시 Tail(뒤)에서부터 차례대로 추가/삭제 시 ( Push_back(), pop_back() )을 이용하게된다.

 만약 배열 중간에 데이터를 삽입하고자 한다면 insert()를 사용하여 삽입은 가능하나 동적 할당 및 재할당의 관점에서 본다면 효율성이 떨어지는 결과를 가져오게된다.

 

생성자 사용방법 정리 

vector를 사용하기 위해서는 우선 <vector> 헤더를 지정하여 사용할 수 있다.

template<class T, class Allocator = std::allocator<T>> class vector;

namespace pmr{ Template <class T> using vector = std::vector<T, std::pmr::polymorphic_allocator<T>>;

vector<[datatype]> name;

 

선언 예시

 

vector<int> vec; - 기본적인 생성자 vector의 크기를 정하지 않은 int 타입 벡터 vec 선언

vector<int> vec = { 1, 2, 3}; - vector의 크기가 정해지지 않은 int 타입 벡터 선언후 1, 2, 3으로 초기화 

vector<int> vec[10]; - int타입의 벡터 크기가 10인 배열 생성 

vector<int> vec[] = { {1,2},{3,4},{5,6} } - int형 벡터 배열 생성 * 행은 가변이지만 열의 길이는 고정되어있음 

vector<vector<int>> vec; 2차원 벡터 생성 ( 행 열 모두 가변형 ) 

vector<int>vec(10); - 기본값이 0으로 초기화하며 사이즈가 10인 int타입의 벡터 vec을 선언

vector<string>vec(10); - 기본값이 0으로 초기화된 사이즈 10인 벡터 vec을 선언

vector<int>vec(10,1); - 기본값 1로 초기화된 사이즈 10인 벡터 vec을 선언

vector<int> vec2(vec); - 벡터 vec을 복사하여 vec2 벡터 생성

 

멤버함수 정리

Vector<int> v = { 1, 2,3, 4, 5 };, vector<int>v2 = {5,4,3,2,1}로 선언하였다는 전제 하에 정리를 진행해보겠다.

멤버함수 Descrption 비고
assign(range,init) . range만큼 init값으로 초기화  
get_allocator()    
at(index) . index 번째의 원소를 반환 at()은 범위 점검을 하여 안전하지만 []는 범위를 넘어가는 index가 들어오는순간 에러가난다 대신 at은 []에비해 속도는 느려지게 된다
v[index] . index 번째의 원소를 반환  
front() . vector의 첫 원소를 반환  
back() . vector의 마지막 원소를 반환  
data() . 벡터가가 소유한 요소들을 저장하는 데 내부적으로 사용하는 메모리 배열에 대한 직접 포인터(direct pointer)를 반환  
begin() . iterator로 접근 시 vector의 맨 첫 지점의 위치를 가리킴  
end() . iterator로 접근 시 vector의 맨 마지막 위치 다음의 위치를 가리킴  
cbegin() . 벡터의 첫 번째 요소를 가리키는 const 반복자를 반환  
cend() . 벡터의 마지막 요소의 다음을 가리키는 이론적인 요소(theorectical element)를 가리키는 const 반복자를 반환  
rbegin() . 벡터의 끝점을 반환  
rend() . 벡터의 시적-1점을 반환  
crbegin() . (반대 방향에서 시작하는) 벡터의 마지막 요소를 가리키는 const 역방향 반복자를 반환합니다. 마지막 요소에서 첫 번째 요소로 이동  
crend() . 벡터의 첫 번째 요소의 다음을 가리키는 이론적인 요소(theorectical element)를 가리키는 const 반복자를 반환  
empty() . 벡터 v가 비어있는지 체크.
. 비어있을 경우 True, 
. 데이터가 있는경우 False.
 
size() . 벡터 v의 원소 갯수를 반환 . C의 strlen(),  JAVA의 length()처럼 사용가능.
max_size() . 벡터 v의 원소 개수를 반환
. 컨테이너 벡터v가 담을수 있는 최대 원소의 개수 반환
 
capacity() . 벡터의 실제 할당된 메모리 크기 반환  
reserve(n)
reserve(n,n2)
. 미리 capacity르 결정하는 멤버 함수

. 벡터 v를 N의 크기로 변경
. 벡터 v를 N의 크기로 변경후 데이터룰 n2로 초기화
 
capacity()    
shrink_to_fit() . 벡터의 capacity를 size에 맞춤.  
clear() . 백터 내의 모든 데이터 삭제  
insert(index,data) . 벡터v의 원하는 index에 data를 추가 v.insert(v.begin(),100);
auto iter = v.end();
v.insert(iter-4,200);
emplace(index, data) . 사용자가 원하는 위치에 원소 삽입
(move하기때문에 복사생성자는 아니다 ).
push_back은 값을 넣는과정에서 복사생성자를 호출하여 값을 넣게된다.
insert역시 모든 값을 메모리에 복사한 후 해당 메모리에 값을 넣게된다 이럴경우 
오버헤드로인해 성능저하 이슈가 생기게된다.

그래서 emplace와 emplace_back이 생기게 되었다. 생성자만 호출하여 데이터를 추가하는 멤버 함수다.
erase(iter)
erase(st_add ,ed_add)
. iter반복자를 통해 원소 위치에 접근 후 벡터 v의 데이터를 삭제.
. st_add부터 ed_add까지 위치의 원소 제거 .

v.push_back(10);
v.push_back(30);
auto iter = v.begin();
auto iter2 = v.end();
v.erase(iter);
v.erase(iter+1,iter-3);

push_back(data) . 벡터 v의 데이터 타입에 맞는 데이터 (정수 , 문자, 문자열 등) 를 맨 끝위치에 추가함.  
pop_back() . 벡터 v의 데이터를 삭제  
emplace_back() . 벡터의 마지막 부분에 새로운 요소를 추가한다 . 
(move하기때문에 복사생성자는 아니다 ).
push_back은 값을 넣는과정에서 복사생성자를 호출하여 값을 넣게된다.
insert역시 모든 값을 메모리에 복사한 후 해당 메모리에 값을 넣게된다 이럴경우 
오버헤드로인해 성능저하 이슈가 생기게된다.

그래서 emplace와 emplace_back이 생기게 되었다. 생성자만 호출하여 데이터를 추가하는 멤버 함수다.
resize(x) . 컨테이너 벡터v의 사이즈를 x로 변경.
. capacity는 변경되지 않는다.
. size초과시 0으로 초기화 
 
swap(vector v) . 벡터v1와 벡터 v2를 스왑.  

 

reference 

https://en.cppreference.com/w/cpp/container/vector

 

std::vector - cppreference.com

template<     class T,     class Allocator = std::allocator > class vector; (1) (2) (since C++17) 1) std::vector is a sequence container that encapsulates dynamic size arrays. The elements are stored contiguously, which means that elements can be acces

en.cppreference.com

 

반응형
LIST