디시인사이드 갤러리

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

갤러리 본문 영역

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

연화갤로그로 이동합니다. 2010.10.14 01:39:27
조회 251 추천 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/10 - -
225118 [BGM] 오늘 정말 너무 춥네요... [3] Rei@디씨갤로그로 이동합니다. 10.12.15 75 0
225117 c는 다시 복습해도 헷갈리는 게 있네...쩝... [2] 아 왜.(118.41) 10.12.15 127 0
225116 살려줘님 보세요. 숙제 해드립니다. nRST갤로그로 이동합니다. 10.12.15 67 0
225115 이런 게시판 만들수 있을까요? [2] (121.151) 10.12.15 79 0
225114 오늘 길바닥에서 어떤 아줌마가 쳐맞길래 [3] Tsabes(116.44) 10.12.15 150 0
225112 코딩하기 괜춘한 노트북 추천좀 [6] elwlwlwk갤로그로 이동합니다. 10.12.15 150 0
225111 애니를 볼때마다 [2] elwlwlwk갤로그로 이동합니다. 10.12.15 59 0
225110 외국너마가 쓴 안들호이드 책이 너무 불친절하네.. [3] 홍어(58.180) 10.12.15 108 0
225109 왜 void main() 하면 컴파일 실패고 int main()하면 됨? [12] 아 왜.(118.41) 10.12.15 154 0
225108 이해하기 굉장히 쉬운 코드 [6] nRST갤로그로 이동합니다. 10.12.15 182 0
225102 LCD화면 뒤로 완전히 접히는 놋북이나 넷북 춧현좀.. [2] 홍어(58.180) 10.12.15 106 0
225101 오늘 진짜 춥다. 꿀레갤로그로 이동합니다. 10.12.15 30 0
225100 지하철 폭행남.. 여자가 자기 밀어서 때렸대. 빕뱟뱟갤로그로 이동합니다. 10.12.15 99 0
225098 토드 좋은점이 뭐에요 ? [1] 미츠도모에갤로그로 이동합니다. 10.12.15 111 0
225097 가까운 미래에 유행할 게임의 특성 [1] 대마법서오즈갤로그로 이동합니다. 10.12.15 123 0
225096 이중패스 어셈블러 ,, 가르쳐주세요.. [6] 에휴(61.38) 10.12.15 561 0
225095 형들 나 안드로이드 어플 맹그러야하는데 [6] 카아캬욤(61.79) 10.12.15 131 0
225094 아 이제 디씨 오기 실타 [8] 분당살람갤로그로 이동합니다. 10.12.15 168 0
225093 Brics 경제성장 종나하는데 100억 돌파는 시간문제다.. [1] 홍어(58.180) 10.12.15 66 0
225092 c팔 열혈강의데이터베이스책삿는데 [2] 유리한추종자(120.50) 10.12.15 144 0
225090 c언어 하나만 짜줘 ㅠ [13] 살려줘 (175.206) 10.12.15 229 0
225089 뉴비한테 C공부방향 조언좀 해줘용 >_< [4] C의세계로(124.254) 10.12.15 125 0
225088 컴공 교수들한테 잘보이는 방법 없을까? [3] 전과(124.194) 10.12.15 142 0
225087 전설의 어샌지 보험 파일인 AES 256 분석하기 ㅋㅋ.... [8] HTC Desire Rooting갤로그로 이동합니다. 10.12.15 282 0
225086 음냐...입금 하시라니깐여..소스는 여기.. 홍어(58.180) 10.12.15 62 0
225085 게임 만듬.torrent [2] vczxzc(211.203) 10.12.15 141 0
225084 수학 잘하는 사람? [8] 햏햏했갤로그로 이동합니다. 10.12.15 177 0
225083 asp.net 말고 c#에서 html 파싱 지원하냐? [5] ㅂㅈㅂㅈ(121.135) 10.12.15 171 0
225082 윈도우7에서 SetWindowsHookEx 사용해 보신 분 계세요? [1] ㅗㄹ갤로그로 이동합니다. 10.12.15 151 0
225081 밑에 질문글 관련다시질문할께요 ㅇㅇㅇㅇ(203.246) 10.12.15 30 0
225080 \이걸 문자로 출력해내려면 어떻게해야하나요? 자바에서요 [2] ㅇㅇㅇㅇ(203.246) 10.12.15 91 0
225079 학생들이 프로그래밍 공부하는데 스맛폰 앱 개발이 최고인듯 함 [1] 시불라미갤로그로 이동합니다. 10.12.15 173 0
225077 내 아이패드에 나도 모르는 010번호가 부여되어 있네ㅋ [3] 분당살람갤로그로 이동합니다. 10.12.15 163 0
225073 문자열 중간에 바꾸는것좀 가르쳐 주세요ㅠ [6] ㄷㄷㄷ(203.246) 10.12.15 72 0
225072 꾸진환경에서도 공부를 잘하면 된다고요? [3] ㅇㅇ(112.159) 10.12.15 70 0
225070 이정도 사양에 77만 4천원이면 졸라 싼거네 [14] .3(124.137) 10.12.15 248 0
225069 Debug It! 실용주의 디버깅! [5] 한강구조견(59.6) 10.12.15 130 0
225068 야 집에 나뒹그는 AMD 윈저 3800 1기가 램 컴터가 있는데 [6] 홍어(58.180) 10.12.15 75 0
225067 솔직히 4년제 컴공과 개꽝인듯 [6] Tsabes(58.72) 10.12.15 286 0
225066 집에 굴러다니는 TG 놋북이 있는데 [9] Tsabes(58.72) 10.12.15 97 0
225065 병특하면 [9] 히밤리눅스갤로그로 이동합니다. 10.12.15 149 0
225063 면접보면서 압박당하느니.. [10] 홍어(58.180) 10.12.15 242 0
225061 공학용 계산기에 function 미리 짜넣는 법좀 [5] 쭈쭈바(111.118) 10.12.15 123 0
225060 뭐 들을까? [3] 머그컵갤로그로 이동합니다. 10.12.15 51 0
225059 프린터사망 이모군(211.40) 10.12.15 33 0
225058 2주동안 심혈을 기울인 거다 쓸사람 써 [12] 히밤리눅스갤로그로 이동합니다. 10.12.15 194 0
225057 영화 하나 추천 바람 [13] rntjr갤로그로 이동합니다. 10.12.15 162 0
225055 아스트랄 투사...춰래블... [1] 돌아온yoi(203.255) 10.12.15 86 0
225052 자바에서 panel에 이미지 붙이는 방법이있나여? ㄷㄷㄷ(203.246) 10.12.15 113 0
225051 블리자드 글픽 >>> 넘사벽 쉐이더 떡칠 c9 [5] 홍어(58.180) 10.12.15 257 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2