커뮤니티 | 큐티/임베디드/큐토피아 | PODO | SDL | 마이크로윈도우 | 리눅스프로그래밍 | 기타 | 포인트순위 | 최근게시물최근게시물 RSS  
korone.net에 다루었으면 하는것은요?
 
 
 
 
 
283
882
3,878
3,960,817
  현재접속자 : 76 (회원 0)






배너 신청 문의

 
작성일 : 14-10-01 09:36
[QT/Win32] Qt에서 사용되는 컨테이너들을 정리해 보았습니다.
 글쓴이 : devilqoo
조회 : 7,898   추천 : 0  
   http://kbdyj.tistory.com/entry/Qt-Generic-Container-%EC%A0%95%EB%A6%AC [1410]
QList가 STL의 리스트인줄 알고 아무생각 없이 써 왔는데 Vector같은 놈이네요.

정신이 번쩍들이 이 기회에 Qt에서 제공하는 컨테이너들을 한번 정리해 보았습니다.

제가 확인한 문서에 의하면 QList<T>가 범용적인 경우에 가장 좋은 퍼포먼스와 사용성을 보여준다고 합니다.
QList<T>를 애용하라는 내용인 듯.
하지만 문제해결에 가장 알맞는 컨테이너를 고르는 게 삼척동자도 아는 정석입죠.

자세한건 아래에...






QList 가 list가 아니었어 !!!

메뉴얼 따위는 가볍게 패스하는 한국인 종특인가.
막연히 std::list라고 생각하면서 써왔던 QList<T>가 실은 std::vector에 가깝다는 사실을 달리는 9호선 급행열차안에서 알게 되었다.

이를 기회로 Qt에서 제공되는 컨테이너 템플릿 클래스들을 한번 정리해 보기로 했다.

QList<T>
list의 탈을 쓰고 있지만 stl의 vector에 가깝다.
그럼 QVector는 또 무엇인가???
뒤에서 설명을 이어나가겠으니 일단 패쓰~
Qt에서 stl의 list에 해당하는 클래스는 QLinkedList<T>이다.
왜 저 클래스를 보면서 한번도 QList에 대해 의심을 가지지 않았는지 ㅡㅡ;

QList<T>는 포인터의 배열을 이용해 구현이 되었으며 미리 공간을 확보해 놓는 특징이 있다.
인덱스 기반의 랜덤 엑세스에 최적화 되었으며 1000개 이하의 아이템관리에 적합하다고 설명이 되어있다.
prepend()와 append()명령을 활용하면 좋은 퍼포먼스를 보여준다.

QStringList<T>
QList<QString>을 상속받은 편의 클래스이다.

QLinkedList<T>
stl에서 list에 해당하는 클래스가 QLinkedList이다.
노드를 타면서 순차검색을 하고자 한다면 이 클래스가 딱이다.
검색은 느리지만 삽입,삭제가 매우 빠른 특징을 가지고 있다.
뭐 이건 자료구조 공부했으면 다 아는 내용이니 더이상의 자세한 설명은 패스.

QVector<T>
연속 메모리를 이용해 구현되었으며 인덱스 기반의 랜덤 엑세스에 최적화 되어 있다.
한마디로 배열 참조하듯이 쓰면 짱이라는 뜻!!!
초기 사이즈로 생성될 수 있으나 공간을 다 썼을 때 좀 더 큰 용량으로 메모리의 재할 당 및 기존 아이템들의 복사가 이루어 지기 때문에 insert, append, prepend의 성능은 떨어진다.

[참고]
QList<T>는 내부적으로 데이터 관리를 위해 포인터의 배열을 가지고 있으며 QVector<T>는 단일 메모리 포인터를 사용한다는 점이 차이점이다.

QStack<T>
QVector<T>를 public 상속하여 구현하였으며 추가적으로 stack의 특성인 push(), pop(), top()의 맴버함수가 추가되었다.
하지만 QVector<T>의 특성을 그대로 물려 받았기에 stack은 아니고 stack연산이 추가되었다 정도로 이해하면 되겠다.
웃기게도 stack 중간의 아이템을 삭제할 수 있다. ^^

QMap<Key, T>
정렬된 연관 컨테이너이다.
Key로 짝을 이루는 값을 빠르게 얻고자 할 때 사용되며 내부적으로 자료구조를 균형잡히게 구성하고 메모리를 효율적으로 이용하여 구현하였다.
Key타입은 operator<()와 operator==()을 구현하여야 하는 점에 유의.

QHash<Key, T>
QMap<Key, T>과 같이 연관 컨테이너이고 Key를 lookup(참조)할 때 해시테이블을 사용한다는 점이 QMap<Key, T>과 다르다.
Key의 lookup(참조)과 삽입속도는 빠르나 탐색과 정렬에는 좋지 않다.
Key타입에 대해 operator==()가 구현되어 있어야 하는 점에 유의.

QMultiMap<Key, T>
QMap<Key,T>과 동일하나 하나의 키에 여러 값들을 연관 시킬 수 있다.

QCache<Key, T>
이거 못보던 놈인데... QMap<Key, T>처럼 연관 컨테이너 지만 최근 lookup한 결과를 캐시로 보존하고 있다가 빠르게 결과를 뱉어내는 엄청난 놈이다.
오래된 lookup은 자동으로 제거하니 말 그대로 캐시기능이 탑재된 QMap<Key, T>.

QSet<T>
T타입의 값들을 내부적으로 QHash<Key, T>를 이용하여 구현하였다.
T가 Key가 되고 쌍이 되는 value는 그냥 더미값을 넣어둔다.
QHash<Key, T>를 이용하므로 삽입과 lookup이 빠른 특징이 있다.
QSet<T> 객체간에 union, intersection, set difference등의 연산을 지원한다.

마지막으로 템플릿 파라메타 T에 해당하는 클래스들은 대입 가능한 타입이어야 하는 특징이 있다.
이는 기본 생성자, 복사 생성자 그리고 대입연산자가 지원됨을 의미하는 데 여기서 한가지 떠올려야할 클래스가 있다.

바로 QObject 클래스 인데 아시는 분은 아시겠지만 복사 생성자, 대입연산자가 private로 막혀있다는 사실. (왜 막았는지에 대해서는 나중에 따로 설명하는 시간을 가져보도록 하겠다.)
고로 컨테이너에 value타입으로 QObject(그리고 이를 상속받는 클래스 모두)를 사용할 수 없고 정 쓰고 싶으면 QObject의 포인터는 사용할 수 있으니 잘 기억해 두도록 하자.
Qt !!!



korone 14-10-01 11:10
 
여기에도 내용을 좀 써주시면 좋을 것 같습니다.
포맷이 안 맞으면 복사 붙여넣기라도 해 주시면 좋을 것 같습니다.

내용이 없이 답글만 달아서 제가 좀 이상한 상황인데
QList가 vecotor같은것이라고 보기보다는 std::vector와 같은것은 QVector이고
QList는 vector와 같은 장점을 가지는 빠른 list로 저는 생각하고 있습니다.
     
devilqoo 14-10-01 11:16
 
내용 정리되는 데로 옮기겠습니다.
korone님의 글을 보니 vector와 같은 장점을 가지는 빠른 list로 이해하는게 더 쉬울 수도 있겠습니다.
근데 [] operator가 지원되는 거보면 벡터 같기도 하고 ...

아주 요상한 놈 이네요. ^^;
          
korone 14-10-01 11:23
 
std::list 가 operator[]를 제공하지 않아서 간혹 불편할때가 있거든요.
std::list는 std::list는 list고 operator[]를 사용하려면  vector를 써야한다. 그게 맞는 디자인이고 성능도 빠르다! 라고 이야기 하기 때문에
데이타가 몇건 되지도 않고 큰 성능상의 이점이 없을때, 그냥 operator[]을 써서 간편하게 해결하고 싶은 경우가 있거든요.
구름님 14-10-10 10:23
 
프로그램의 목적에 부합되는 클래스를 사용하는게 제일이겠죠. 그런면에서 커다란 도움이 되는 글입니다.
개인적으로는 자료들을 액세스하는데에 걸리는 속도가 제일 중요하다고 생각되는데요.
하지만, 보통 몇십~몇백건의 자료를 처리하는데에 그치는 경우에는 그다지 차이점을 실감하지 못한다는게..
어떻게 보면 함정 같기도 합니다. ㅎㅎ
 
 

Total 220
번호 제   목 글쓴이 날짜 조회 추천
220 자신이 해야 할 일을 결정하는 사람은 세상에… rqyuspv875 10-21 5 0
219 산다는것 그것은 치열한 전투이다. -로망로랑… rqyuspv875 10-21 3 0
218 인간의 삶 전체는 단지 한 순간에 불과하다 . … rqyuspv875 10-21 3 0
217 source 삶이 그대를 속일지라도 슬퍼하거나 노… rqyuspv875 10-21 3 0
216 내일은 내일의 태양이 뜬다 피할수 없으면 즐… wyltqme425 10-20 9 0
215 인생이란 학교에는 불행 이란 훌륭한 스승이 … wyltqme425 10-20 6 0
214 최고에 도달하려면 최저에서 시작하라.-P.시… wyltqme425 10-20 2 0
213 해야 할 것을 하라. 모든 것은 타인의 행복을 … wyltqme425 10-20 3 0
212 평생 살 것처럼 꿈을 꾸어라.그리고 내일 죽… wyltqme425 10-20 10 0
211 이룰수 없는 꿈을 꾸고 이길수 없는 적과 싸… wyltqme425 10-20 7 0
210 만약 우리가 할 수 있는 일을 모두 한다면 우… wyltqme425 10-20 16 0
209 꿈을 계속 간직하고 있으면 반드시 실현할 때… wyltqme425 10-20 7 0
208 사막이 아름다운 것은 어딘가에 샘이 숨겨져 … wyltqme425 10-20 4 0
207 자신의 본성이 어떤것이든 그에 충실하라 . … wyltqme425 10-20 3 0
206 아래에 비교하면 남음이 있다.-명심보감[쇼미… wyltqme425 10-20 7 0
205 nephew 삶이 있는 한 희망은 있다 -키케로유혜… wyltqme425 10-20 7 0
204 고통이 남기고 간 뒤를 보라! 고난이 지나면 … rqyuspv875 10-20 7 0
203 진짜 문제는 사람들의 마음이다.그것은 절대… rqyuspv875 10-20 9 0
202 지금이야 말로 일할때다. 지금이야말로 싸울… rqyuspv875 10-20 6 0
201 도저히 손댈 수가 없는 곤란에 부딪혔다면 과… rqyuspv875 10-20 19 0
200 우선 무엇이 되고자 하는가를 자신에게 말하… rqyuspv875 10-20 9 0
199 longer 자신감 있는 표정을 지으면 자신감이 생… rqyuspv875 10-20 3 0
198 [QT/Win32] MFC에서 Qt 사용하기 팁. (3) devilqoo 09-10 3059 0
197 [QT/X11] QML 모델을 C++ 코드로 구현하는 방법 중 하나 (1) 구름님 12-03 4758 0
196 [QT/X11] QWT for qt android (1) 구름님 03-07 6311 1
195 [QT/Embedded] QTcpSocket사용 시 플러그 뽑힘 증상 체크 방법 요원009 11-13 10251 0
194 [QT/Win32] QML 에서 CustomModule 을 import 하여 사용하기 tmdwn 05-18 5871 0
193 [QT/Embedded] Qt update함수/repaint함수 사용법좀 알려주세여.. (1) 잉농 05-14 5738 0
192 [QT/Embedded] C++ Exception을 활용한 런타임 콜스택 정보 얻기 (1) korone 04-01 6070 0
191 [QT/Embedded] Qt 5.4.1 raspberry Pi 프로그램 개발하기 (5) 구름님 03-31 20192 1
 1  2  3  4  5  6  7  8  


About korone.net | Copyright 2003 korone.net. All rights reserved.