반응형

Vector 3 추가/삭제/변경


-swap

같은 타입의 두 벡터의 엘리먼트들을 바꾼다. 크기는 상관없다.

std::vector<int> foo(3,100) ;     // 100을 값으로 갖는 요소 3개

std::vector<int> bar(5, 200) ;    // 300을 값으로 갖는 요소 5개


foo.swap(bar);    // foo와 bar 두 개의 벡터들이 서로 바뀐다.

foo ; ==> 200 200 200 200 200

bar ; ==> 100 100 100


-push_back ; 벡터 마지막에 요소 추가. 복사(새롭게) 추가됨. 벡터 크기가 자동으로 증가. 메모리도 부족하면 자동으로 추가 할당됨.

std::vector<int> v1 ;

v1.push_back(100) ;

v1.push_back(200) ;

-pop_back ; 벡터 마지막 요소를 제거한다. 리턴값 없음.

마지막 요소값을 확인하려면 pop_back()하기 전에 back()으로 확인 가능.

while( !v1.empty() ) {

   sum+=v1.back() ;

  v1.pop_back() ;

}

v1벡터가 빌때까지 하나씩 요소들을 제거함. 요소 제거 전에 제거할 값을 얻어 총 합을 구한다.


-insert

특정 위치가 새로운 요소를 삽입한다.

insert ( const_iterator position,  const value_type & val) ;

insert( " , size_type n, const value_type &val) ;

insert(", InputIterator first, InputIterator last) ;

insert(", value_type&& val) ;

insert(", initializer_list<value_type> il) ;

리턴값 ;새로 추가한 첫번째 요소 위치 이터레이터

std::vector<int> v1(3,100) ;    // 100 100 100

std::vector<int>::iterator it ;

it = v1.begin() ;

it = v1.insert(it, 200) ;    // 200 100 100 100

v1.insert(it, 2, 300) ; // 300 300 200 100 100 100 

std::vector<int> v2(2, 400) ;    // 400 400 

v1.insert(v1.begin()+2, v2.begin(), v2.end()) ;    // 300 300 400 400 200 100 100 100 

(v2.end() 전 위치까지만 추가함).

int arr[]={501,502,503};

v1.insert(v1.begin(), arr, arr+3 ) ;    // 501 502 503 300 300 400 400 200 100 100 100 

 (arr+3 전 위치까지 추가함.)


 -erase

특정 위치 또는 위치 범위의 요소들을 제거

v1.erase(v1.begin()+5) ;    // 6번째 요소를 제거함. (인덱스는 0부터시작)

v1.erase(v1.begin(), v1.begin()+3) ;    // 앞에서 부터 3개를 제거. (두 번째 파라미터로 지정한 위치 전까지만 제거됨)

-clear ; 전체 요소 삭제


-emplace

할당과 삽입. insert는 복사하여 삽입이지만, emplace는 할당된 것을 그대로 사용하여 성능면에서는 낫다.

std::vector<int> v1={10,20,30} ;

auto it = v1.emplace(v1.begin()+1, 100) ;    // 10, 100, 20, 30

v1.emplace(it, 200) ;    // 10, 200, 100, 20, 30

v1.emplace(v1.end(), 300) ;    // 10, 200, 100, 20, 30, 300


-emplace_back

push_back()과 거의 똑같다. push_back()은 복사하여 사용하는데, emplace_back은 construct 한 것을 그대로 사용하기 때문에 성능면에서 좀 낫다.

v1.emplace_back(100);    // v1 마지막에 100 추가.





'Develop > C&CPP' 카테고리의 다른 글

List 1  (0) 2018.05.28
Array 1  (0) 2018.05.25
Vector 2  (0) 2018.05.18
Vector 1  (0) 2018.05.16
정규식으로 스트링 일부 추출하기  (0) 2018.03.10
반응형

cpp Vector 2


+ vector의 element 탐색

-std::vector::begin

첫번째 엘리먼트를 가리키는 이터레이터를 리턴한다.

컨테이너가 empty이면 리턴값은 dereference할 수 없다.

-std::vector::end

마지막을 지난 엘리먼트의 위치를 가리키는 이터레이터를 리턴한다.

past-the-end 엘리먼트는 벡터의 마지막 엘리먼트 뒤의 이론적 엘리먼트다. 따라서 dereference할 수 없다.

컨테이너가 empty이면 리턴값은 vector::begin의 리턴값과 같다.


ex)

std::vector<int> my ;

for (int i=1; i<=5; i++) my.push_back(i) ;

for(std::vector<int>::iterator it=my.begin(); it!=my.end(); ++it) 

   std::cout << " " << *it ;

my vector의 모든 엘리먼트 탐색하여 출력. 1,2,3,4,5


+ 역방향 탐색

vector::rbegin()    ,   vector::rend()

int i=0 ;

std::vector<int> my(5) ; 

std::vector<int>::reverse_iterator rit = my.rbegin() ;

for (; rit!=my.rend(); ++rit)  *rit = ++i ;

출력하면 5,4,3,2,1 을 갖는다.


+첫번째 값, 마지막 값

vector::front()    , vector::back()

begin(), end()는 iterator로 위치를 의미하지만, front(), back()은 위치가 아니라 엘리먼트의 값을 참조로 리턴한다.

std::vector<int> my ;

my.push_back(50) ;

my.push_back(20) ;

my.front() -= my.back() ;    // 첫번째 엘리먼트에 첫번째 - 마지막 값으로 할당한다.

std::cout << my.front() << std::endl ;

첫번째 값이 30으로 변경되어 30이 출력된다.


std::vector<int> my ;

my.push_back(10) ;

while ( my.back()!=0 ) my.push_back(  my.back() -1 ) ;

출력하면 10, 9, 8, ..., 2, 1, 0


+const iterator

vector::cbegin()        vector::cend()

vector::crbegin()        vector::crend()

begin(), end()와의 차이점은 리턴값이 const_iterator 로써 iterator를 통한 엘리먼트의 값을 변경할 수 없다. (*it=value --> compile error)

+data

value_type *data()

첫번째 엘리먼트 배열 메모리의 포인터를 리턴한다.  벡터는 엘리먼트들이 연속적인 메모리에 위치되도록 보장한다. 따라서 주소로 접근 가능.

std::vector<int> my(5) ;

int *p = my.data() ;

*p=10 ;

p++ ;

*p=20 ;

p[2]=40 ;

출력하면 10, 20, 0, 40, 0


+ [] operator

벡터의 n번째 위치의 엘리먼트를 참조로 리턴한다.

my[i] 이렇게 배열처럼  읽고 쓰기가 사용가능.




 



'Develop > C&CPP' 카테고리의 다른 글

Array 1  (0) 2018.05.25
Vector 3  (0) 2018.05.23
Vector 1  (0) 2018.05.16
정규식으로 스트링 일부 추출하기  (0) 2018.03.10
gdb로 디버깅하기  (0) 2018.03.06
반응형

cpp의 vector (std::vector)


크기를 변경할 수 있는 배열로 표현된 컨테이너

배열처럼 인덱스로 접근이 가능.

배열과 다르게 동적으로 크기 변화가 되며 메모리가 자동으로 관리

엘리먼트들의 순서가 있는 컨테이너. 엘리먼트의 위치 인덱스로 접근

#include <vector>


+초기화

std::vector<int> a1;    // 빈 객체

std::vector<int> a2(4, 100) ; // 100의 값을 갖는 엘리먼트들을 4개만들어 초기화.

std::vector<int> a3(a2.begin(), a2.end());  // a2의 이터레이터를 통한 복사.

std::vector<int> a4(a3) ;     // a3 복사

 

-배열을 복사

int array1={1,2,3,4,5} ;

std::vector<int> a5(array1, array1+sizeof(array1)/sizeof(int)) ;  // 두 번째 파라미터는 배열의 마지막 노드의 다음 노드의 포인터.

-출력/탐색

for(std::vector<int>::iterator it = a5.begin(); it!=a5.end(); it++)

    std::cout << " " << *it ;    // *it ; 이터레이터가 가리키는 엘리먼트의 값.(int)

=>  a5.end()는 a5의 마지막 노드의 위치 다음으로 끝을 가리키는 위치로 볼 수 있다. 따라서 위에서 마지막까지 빠짐없이 전체의 값을 출력할 수 있다.


+ 복사

= operator : 다른 컨테이너의 내용을 기존 내용에 덮어쓴다. (크기도 수정됨.)

std::vector<int> a1(3, 0) ;

std::vector<int> a2(5, 0) ;

a2 = a1 ;

a1=std::vector<int>();

a2의 크기는 5에서 3으로 변경되고, 기존 a1의 elements들로 바뀜.

a1은 다시 초기화하여 empty가 된다.


+할당

assign()

std::vector<int> a1, a2, a3 ;

a1.assign(5, 1) ;    // 5개의 노드를 만들고, 전부 1로 초기화.

std::vector<int>::iterator it = a1.begin()+1 ;    // a1의 두 번째를 가리킴.

a2.assign( it, a1.end()-1 ) ; //위의 이터레이터 부터 a1의 끝 하나 전까지 a2로 할당(복사). a1에서 앞, 뒤 하나씩뺀 3개가 복사됨.

a3.assign( arr1, arr1+3 ) ;   // arr1 배열에서 3개를 복사.


+벡터 크기와 크기 변경.

-벡터의 크기.

a1.size();   // 엘리먼트의 개수를 리턴함.

-벡터의 용량

a1.capacity();    // 메모리가 할당된 크기. (엘리먼트 크기 단위)

capacity는 size와 다를 수 있다. 실제 데이터 크기보다 메모리를 reserve로 더 많이 할당될 수도 있다.  (  size <= capacity )

벡터는 데이터 추가시에 알아사 자동으로 메모리가 확장되기 때문에 할당문제를 고려할 필요가 없지만 성능상 미리 메모리 할당이 필요한 경우 reserve()를 통해 최대로 받을 아이템 개수를 파라미터로 설정해 두는 것도 좋다.


-벡터 크기 변경

void resize(size_type n ) ;

void resize(size_type n , const value_type &val) ;

벡터의 크기를 n으로 변경. 현재 컨테이너 크기보다 작게 설정하면, n개의 엘리먼트까지만 유효하다. (나머지는 삭제).

현재 컨테이너 크기보다 크게 설정하면, 기존 데이터를 유지하고 크기가 확장. val값을 지정하면 해당 값으로 채운다.

현재의 capacity보다도 크면, 알아서 메모리 할당까지 해준다.

std::vector<int> a1 ;

for(i=0 i<10; i++) a1.push_back(i) ;    // 0~9까지 10개의 노드 추가.

a1.resize(5);    // 크기를 5로 지정. 데이터는 0~4까지만 존재.

a1.resize(8, 10);    //크기를 8로 확장. 뒤에 3개의 공간이 더 생기고 10으로 초기화됨.

a1.resize(12);     // 크기를 12로 확장. 뒤에 4개의 공간이 더 생기고 빈 값(0으로 초기화).

a1 전체 출력

for (int i=0; i<a1.size(); i++) std::cout << " " <<a1[i] ;

0 1 2 3 4 10 10 10 0 0 0 0 








'Develop > C&CPP' 카테고리의 다른 글

Vector 3  (0) 2018.05.23
Vector 2  (0) 2018.05.18
정규식으로 스트링 일부 추출하기  (0) 2018.03.10
gdb로 디버깅하기  (0) 2018.03.06
mutex 동기화 예제  (1) 2018.03.06

+ Recent posts