시퀀스컨테이너-벡터(vector)

벡터
 0. #include <vector> 를 추가해야함.
 1. std 네임스페이스 안에 있음 
 2. 동적배열이다. ( 연속된 메모리 공간 )
 3. 시퀀스 컨테이너.
 4. 삽입삭제가 느림.
 5. 임의접근 반복자(랜덤엑세스 반복자)를 사용. 
 6. 임의요소 참조 빠름.
 7. 중간요소 삽입삭제가 느림.
 8. 삽입, 삭제시 반복자 무효화 현상이 일어날 수 있다!!
 9. 이론적으로 벡터에 포인터를 저장하는 것이 가능하기는 하지만 여러 가지로 신경써야 할 것들이 많고 불편하기 때문에 벡터에는 통상 값을 저장하는 것이 권장된다. 
 10. bool 타입의 벡터는 여러 활용이 있다. (일단 메모리가 아주 적기때문에 좋다)



벡터의 추가되는 멤버 함수
capacity() :
 실제 메모리안에 vector가 메모리의 재할당 없이 가질 수 있는 원소의 개수를 반환하는 함수.
                     만약 size가 capacity를 넘어버리게 되면 메모리 내부에서 재할당이 이루어진다.
                     (속도 상당히 느림. 메모리위치변경되면서 반복자 무효화 현상이 일어남.)
reserve() : 용량이 꽉 차서 재할당을 막기 위해서 용량을 확보하기 위한 함수
                   레퍼런스들 유효함을 보장됨. 
assign()  :  매개변수로 들어온 원소나 범위를 할당해준다.( list, deque에서도 가능 )



벡터의 용량 줄이기
=> 벡터는 용량을 줄이는 문법따윈 존재하지 않는다.
벡터의 용량을 줄일려면 간접적인 방법을 이용한다.

template < typename T >
void ShrinkCapacity ( std::vector<T>&v )
{
      std::vector<T> temp(v);
      v.swap(temp);
}

//위의 함수를 사용하거나 , 아니면 그냥
//std::vector<T> (v).swap(v); 
//이런식으로 용량을 줄인다.


swap()을 했을때 기억해야 할 점은 모든 레퍼런스와 포인터, 반복자들은 그들의 컨테이너와 같이 교체 된다는점이다!!! 



 

Member types

of template <class T, class Allocator=allocator<T> > class vector; 

member typedefinition
reference Allocator::reference
const_reference Allocator::const_reference
iterator Random access iterator
const_iterator Constant random access iterator
size_type Unsigned integral type (usually same as size_t )
difference_type Signed integral type (usually same as ptrdiff_t )
value_type T
allocator_type Allocator
pointer Allocator::pointer
const_pointer Allocator::const_pointer
reverse_iterator reverse_iterator<iterator>
const_reverse_iterator reverse_iterator<const_iterator>


Member functions


Iterators : 

Capacity : 

Element access : 

Modifiers : 

Allocator : 
 
출저: http://www.cplusplus.com/reference/stl/vector/ 


 

*생성자, 멤버함수 집중 분석 

1.생성자(vector)
 

explicit vector();
explicit vector(size_type n, const T& v = T());
         vector(const vector& x);
         vector(const_iterator first, const_iterator last); 


 
 2.멤버함수들 선언부들
 

void push_back(const T& x);
void pop_back();

iterator insert(iterator it, const T& x = T());
void     insert(iterator it, size_type n, const T& x);
void     insert(iterator it, const_iterator first, const_iterator last);
 
iterator erase(iterator it);
iterator erase(iterator first, iterator last);

void swap(vector& Right);
 
void assign(size_type count, const Type& val);
void assign(InIt first, InIt last);

void resize(int num);
void resize(int num, T value); 

const_reference at(size_type pos) const;
reference          at(size_type pos);
 
T operator [] (int n){ return *(vec.begin()+n);  } 

=>at과 []의 차이는 at은 범위 에러를 검사하지만 []는 아예 무시한다는것!
(front(), back(), []연산자는 범위에러 검사하지 않으므로 엄청 불안정 하다)




vector<bool>

                            사진출저: www.winapi.com

=> C++표준 라이브러리에서는 boolean타입을 가지는 특별한 vector를 제공
1비트만을 사용하는 특수화된 버전.
vector<bool>는 bool타입을 위한 vector<>의 템플릿 특수화
이 특수화된 vector는 레퍼런스와 반복자를 다루는 특별한 방법이 필요.
공급 업체마다 구현방법이 다르게 제공
내부적으로 비트연산을 제공
vector<bool>은 표준에 포함되어 있기는 하지만 몇 가지 점에서 문제가 있고 컴파일러마다 지원 범위가 달라 가급적이면 사용을 자재하는 것이 좋다.

추가된 멤버함수
c.flip() : 모든 boolean 원소들을 반전
m[idx].flip : idx의 원소 반전
m[idx] = val : val을 idx의 대입
m[idx] = m[idx2]  : idx2의 원소의 값을 idx의 원소의 대입



벡터의 활용
=>게임상의 몬스터들?!

정리 참조
1. www.winapi.com
2. C++ standard Library 책



내가 제일 사랑하는 자료구조인  STL 의 vector의 대해서 정리해보았다.
이젠 다른 사이트 안봐도 돼 +_+!

 

이 글을 공유하기

댓글

Designed by JB FACTORY