디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

STL의 vector가 나와서 내 블로그에서 긁어온 글.

연화갤로그로 이동합니다. 2010.10.14 01:39:27
조회 252 추천 0 댓글 1

vector는 원소를 자신의 내부 동적 배열에 복사합니다. 이 원소들은 언제나 자기만의 순서를 가집니다.

그러므로 vector는 순서가 있는 컬렉션이죠. vector는 랜덤 엑세스를 지원하므로 모든 원소를 엑세스하는

작업은 상수 시간의 복잡도를 지닙니다. vector의 반복자는 랜덤 엑세스 반복자이기 때문에,

사용자는 STL의 모든 알고리즘을 사용할 수 있습니다.


vector는 끝에 원소를 추가하거나 제거한다면 정말로 놀라운 성능을 보여줍니다.

그러나 데이터를 중간이나 앞부분에 삽입한다면 성능은 매우 저하됩니다. 이유는, 기존의 원소들이

모두 이동되어야 하기 때문이죠. 따라서 할당 연산자는 삽입된 원소 다음에 존재하는 모든 원소에 대해서

호출되어 집니다.



사이즈와 용량

vector의 성능을 더 끌어올리는 방법은 원소를 저장하기 위해서 필요한 메모리보다 더 큰 메모리를 확보해

두는 것입니다. vector를 효율적으로 사용하기 위해서는 사이즈와 용량이 서로 어떻게 작용하는지

잘 알고 있어야 하죠.


vector는 기본적으로 사이즈를 위해 size(), empty(), max_size()들을 제공합니다.

vector의 사이즈와 관련된 추가적인 함수는 capacity()입니다. capacity()는 실제 메모리 안에

vector가 메모리의 재할당 없이 가질 수 있는 원소의 개수를 반환합니다.

만약 capacity()를 초과한다면 vector는 내부 메모리를 재할당해야만 한다.


vector의 용량은 다음의 2가지 이유 때문에 매우 중요합니다.

1. 재할당은 원소의 모든 레퍼런스와 포인터, 반복자를 무효화 시킵니다.

2. 재할당은 시간을 필요로 합니다.


그러므로 사용자가 vector 안의 포인터나 레퍼런스, 반복자를 관리하거나 또는 속도가 목표라면 용량을

먼저 확보하는 것이 매우 중요합니다.


재할당을 피하기 위해서는 reserve()를 사용하면 됩니다. 이 함수는 사용자가 원하는 만큼의 용량을

확보해 줍니다. 이런 방법을 사용함으로써, 모든 레퍼런스들이 유효함을 보장할 수 있습니다.

단, 용량을 초과하지 않는다는 가정하에서 말이죠.

std::vector<int> v; //빈 vector를 생성
v.reserve(80); //80개의 원소를 위해 메모리를 확보


재할당을 피하는 다른 방법은 생성자에 추가적인 인자를 제공하여 vector를 초기화하는 방법입니다.


예를 들어, 생성자의 파라미터로 수치값을 제공한다면, 원소 타입의 디폴트 생성자를 사용하여

수치 값만큼의 원소를 가진 vector를 생성할 것입니다.

std::vector<T> v(5); //vector를 생성하고 5개의 값으로 초기화한다.
            //T 타입의 디폴트 생성자를 5번 호출한다.


물론, 이러한 방식은 주어진 원소가 디폴트 생성자를 제공한다는 사실을 전제로 합니다.

그러나 기억해야 할 점은, 디폴트 생성자가 제공되는 복잡한 타입에 대해서는 초기화에 시간이 걸린다는

사실입니다. 따라서 초기화를 하는 이유가 재할당을 피하려는 것이라면, 반드시 reserve()를 사용해야만 하죠.


vector의 용량에 대한 아이디어는 스트링의 용량에 대한 아이디어와 한 가지를 제외하고는 매우 유사합니다.

vector에서는 스트링과 달리, 용량을 줄이는 목적으로 reserve()를 호출하는 것이 불가능하죠.

현재의 용량보다 적은 값으로 reserve()를 호출하는 것은 아무런 동작도 하지 않습니다.

사실, 메모리의 단편화를 막기 위해서 대부분의 vector의 구현은 사용자가 reserve()를 호출하지 않는 한,

처음에 큰 메모리 블록을 할당합니다. 만약 사용자가 많은 vector를 사용하고 그 안에 적은 원소들만을

가지고 있다면, 이것은 많은 메모리를 낭비하는 것입니다.


vector의 용량은 절대로 줄어들 수 없기 때문에, 원소가 지워진 이후에도 모든 레퍼런스와 포인터,

반복자들은 유효하게 남아 있는 것을 보장합니다. 그러나 삽입은 레퍼런스와 포인터, 반복자들을 무효화하죠.


vector의 용량을 줄일 수 있는 간접적인 방법이 있습니다. 바로 다른 vector와 용량을 교체하는 것입니다.

다음의 함수는 vector의 원소들을 보호하면서 용량을 줄일 수 있습니다.

template <class T>
void shrinkCapacity(std::vector<T> &v)
{
    std::vector<T> tmp(v); //새로운 vector에 원소들을 복사한다.
    v.swap(tmp); //내부 vector의 데이터를 교체한다.
}


위의 함수말고도 다음과 같은 구문을 작성함으로써 vector의 용량을 줄일 수 있습니다.

//타입 T에 대해서 vector v의 용량을 줄인다.
std::vector<T> (v).swap(v);


그러나 swap() 이후에 기억해야 할 점은, 모든 레퍼런스와 포인터, 반복자들은 그들의 컨테이너와 같이

교체된다는 것입니다. 즉, 그들은 그들이 참조하였던 원소를 계속해서 참조한다는 것이죠.

그러므로 shrinkCapacity()는 모든 레퍼런스와 포인터, 반복자들을 무효화 시킵니다.


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 가족과 완벽하게 손절해야 할 것 같은 스타는? 운영자 24/06/24 - -
226813 아 마지막 글 [14] Finalizer갤로그로 이동합니다. 10.12.24 150 0
226812 나도 떡밥하나 올려볼까 [1] elwlwlwk갤로그로 이동합니다. 10.12.24 101 0
226811 역시 자바가 최고인듯.. [2] 꿀레갤로그로 이동합니다. 10.12.24 175 0
226810 자바 솔찍히 진짜 좁나 병신같은 언어인거 사실이잖아 [3] 개쉛기갤로그로 이동합니다. 10.12.24 192 0
226809 로우 디바이스 재정비 끝! [5] 해일리갤로그로 이동합니다. 10.12.24 94 0
226808 홍어는 자꾸 애먼 프갤에다 무식인증하지 말고 [5] 맥주와묘목(110.15) 10.12.24 94 0
226807 그만 글을싸겠습니다. [3] Finalizer갤로그로 이동합니다. 10.12.24 68 0
226806 나홀로집에 보고왔네여 [2] 꿀레갤로그로 이동합니다. 10.12.24 58 0
226805 짜파게티를 그냥 부숴 먹으면 어떻게 될까 [3] prismatic갤로그로 이동합니다. 10.12.24 104 0
226804 고딩, 대딩들은 미끼를 덥석 물어봅니다. [4] nRST갤로그로 이동합니다. 10.12.24 126 0
226803 세상사람들은 바보가 아니다. [30] Finalizer갤로그로 이동합니다. 10.12.24 222 0
226802 혹시나 하는 마음에 해두는 말인데..클스마스나 클스마스 이브날.. [3] Gromit갤로그로 이동합니다. 10.12.24 107 0
226800 홍어야 [6] 원싸갤로그로 이동합니다. 10.12.24 83 0
226799 페이스북이 돈을 버는 원리가 뭐냐? [9] (187.115) 10.12.24 305 0
226797 나도 자바만을 고집하는건 아냐 [35] Finalizer갤로그로 이동합니다. 10.12.24 249 0
226796 말을 못알아듣는건 무의식적으로 발동하는 자기보호본능 아닐까 [11] 개쉛기갤로그로 이동합니다. 10.12.24 125 0
226795 구글만큼 다언어주의적인 회사도 드물다. [5] 치약맛염산(110.15) 10.12.24 161 0
226794 착시놀이나 하자 [1] elwlwlwk갤로그로 이동합니다. 10.12.24 83 0
226793 덕짤이나 올리자 (4) [1] 땡칠도사갤로그로 이동합니다. 10.12.24 130 0
226792 볕신드라 니들은 그냥 자바가 미운거야. [25] Finalizer갤로그로 이동합니다. 10.12.24 197 0
226791 자고있는 친오빠 옆에와서 빠는 여동생. [6] iljeomobolt갤로그로 이동합니다. 10.12.24 221 0
226790 객체지향의 원조가 오브젝C라면 왜.. [17] Finalizer갤로그로 이동합니다. 10.12.24 220 0
226789 나도 이런 여자친구 갖고싶다 [4] 개쉛기갤로그로 이동합니다. 10.12.24 147 0
226788 자바를 흉내낸 C의 변태버젼 [13] Finalizer갤로그로 이동합니다. 10.12.24 253 0
226787 덕짤이나 올리자 (3) [2] 땡칠도사갤로그로 이동합니다. 10.12.24 127 0
226786 웹 논쟁은 그만,애플과 오라클 연합에 대해 썰을 풀어보자 [26] Finalizer갤로그로 이동합니다. 10.12.24 180 0
226785 SIS 1급 혹은 2급 취득하신 분 계신가요? [1] ㄴㄴ(119.196) 10.12.24 155 0
226784 IO장치 연결시 interrupt 발생? [4] 궁금해(124.60) 10.12.24 98 0
226783 지금 나홀로집에 보니까 감회가 새롭네... [1] 꿀레갤로그로 이동합니다. 10.12.24 57 0
226782 란데르츠 뭐하고 있을까 [2] prismatic갤로그로 이동합니다. 10.12.24 72 0
226781 그런 관계로 나도 덕짤을 올려볼까! 탱자맛어묵(110.15) 10.12.24 75 0
226779 덕짤이나 올리자 (2) [3] 땡칠도사갤로그로 이동합니다. 10.12.24 126 0
226778 언니 오빠야 오늘 뭐해? [4] iljeomobolt갤로그로 이동합니다. 10.12.24 96 0
226776 덕짤이나 올리자 [4] 땡칠도사갤로그로 이동합니다. 10.12.24 116 0
226775 파리 어떻하나? [2] iljeomobolt갤로그로 이동합니다. 10.12.24 94 0
226773 내가 아이러니 때부터 원더걸스를 눈여겨봤지 [3] 노힛갤로그로 이동합니다. 10.12.24 106 0
226772 혼란을 틈탄.. [3] 꿀레갤로그로 이동합니다. 10.12.24 119 0
226771 늅늅 [3] elwlwlwk갤로그로 이동합니다. 10.12.24 54 0
226770 원래 빠질은 [7] 과당맛알콜(110.15) 10.12.24 114 0
226769 오늘 하스켈을 공부하는데... [15] ㅁㄴㅇㄹ(175.200) 10.12.24 205 0
226768 자바로 짜는게 중요한게 아니다 [42] 천회장(211.45) 10.12.24 288 0
226767 훗 오늘은 프갤도뜨겁군 [4] 꿀레갤로그로 이동합니다. 10.12.24 68 0
226766 분위기가 험악해서 내가 낄 자리가 없군... [5] 가위차기(211.254) 10.12.24 82 0
226765 니들이 이쁘지도 않은 여자와 소중한 시간과 돈을 낭비할때 [12] Finalizer갤로그로 이동합니다. 10.12.24 141 0
226764 이대로 키배가 이어졌으면좋겠다. [4] 초밥술사갤로그로 이동합니다. 10.12.24 61 0
226763 프갤 어그로 경진대회 여냐? [6] 아잉따잉갤로그로 이동합니다. 10.12.24 135 0
226761 파이널라이저는 봅니다. [5] 땡칠도사갤로그로 이동합니다. 10.12.24 105 0
226760 닥치고 레일즈가 짱임 [4] 천회장(211.45) 10.12.24 81 0
226759 야 이거 어떻게 된거야 [2] 아잉따잉갤로그로 이동합니다. 10.12.24 66 0
226758 홍어의 문제는 [8] 달걀맛샴푸(110.15) 10.12.24 98 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2