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






배너 신청 문의

 
작성일 : 14-10-01 09:36
[QT/Win32] Qt에서 사용되는 컨테이너들을 정리해 보았습니다.
 글쓴이 : devilqoo
조회 : 7,045   추천 : 0  
   http://kbdyj.tistory.com/entry/Qt-Generic-Container-%EC%A0%95%EB%A6%AC [1278]
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 201
번호 제   목 글쓴이 날짜 조회 추천
201 [QT/Win32] MFC에서 Qt 사용하기 팁. (3) devilqoo 09-10 1608 0
200 [QT/X11] QML 모델을 C++ 코드로 구현하는 방법 중 하나 (1) 구름님 12-03 3919 0
199 [QT/X11] QWT for qt android (1) 구름님 03-07 5552 1
198 [QT/Win32] QtSingleApplication 이용하기 (1) starbig 01-18 5477 0
197 [QT/Win32] Qt 에서 Daum Maps Api geo [ 주소->좌표 변환 ] 사… starbig 01-15 6047 0
196 [QT/Win32] Qt에서 윈도우 서비스 이용하기, Qt Windows Servic starbig 01-15 4817 0
195 [QT/Embedded] QTcpSocket사용 시 플러그 뽑힘 증상 체크 방법 요원009 11-13 8771 0
194 [QT/Win32] QML 에서 CustomModule 을 import 하여 사용하기 tmdwn 05-18 5332 0
193 [QT/Embedded] Qt update함수/repaint함수 사용법좀 알려주세여.. (1) 잉농 05-14 5100 0
192 [QT/Embedded] C++ Exception을 활용한 런타임 콜스택 정보 얻기 (1) korone 04-01 5479 0
191 [QT/Embedded] Qt 5.4.1 raspberry Pi 프로그램 개발하기 (5) 구름님 03-31 18144 1
190 [QT/Win32] Qt 다국어 처리 (2) korone 03-17 10606 0
189 [QT/Win32] signal to signal devilqoo 02-13 4848 0
188 [QT/Win32] Qt x64 바이너리 제공 사이트 (1) 인라이… 02-12 4754 1
187 [QT/Embedded] 우분투 Qt5 크로스 컴파일 (14/11/26 2차 수정) (9) 김아무… 11-12 13425 0
186 [QT/Embedded] Qt 5.3.2에서 Mouse Double Click시 이벤트 문제 (2) korone 11-11 4884 0
185 [QT/Embedded] QtWinExtras korone 11-11 4847 0
184 [QT/Win32] Qt 코딩 스타일 (편집 편) (4) devilqoo 10-22 8765 0
183 [QT/Win32] Qt와 C++11 (2) devilqoo 10-12 8824 1
182 [QT/Win32] Qt 에서의 이벤트 처리 (5) devilqoo 10-09 8515 0
181 [QT/Win32] QList와 QVector의 비교. (2) devilqoo 10-02 6214 0
180 [QT/Win32] Qt에서 사용되는 컨테이너들을 정리해 보았습… (4) devilqoo 10-01 7046 0
179 [QT/X11] qmake DEFINES 변수에 공백문자가 포함된 값을 설… (1) 별님 09-25 4585 0
178 [QT/Win32] 데이터 압축 관련 qCompress(), qUncompress() (9) 구름님 09-16 5034 0
177 [QT/Win32] QML 로 One-Source Multi-Platform (iOS, Android) 실행 tmdwn 09-03 6497 0
176 [QT/Win32] QML 로 iOS Application 제작하기 tmdwn 09-02 6480 0
175 [QT/Win32] QML 로 Android Application 제작하기 (4) tmdwn 09-02 6888 2
174 [QT/X11] qt에서 메모리 조작하기. (2) 나무나… 07-25 6971 0
173 [QT/Win32] Q_DECLARE_FLAGS 매크로 (2) 구름님 07-11 5690 2
172 [QT/Win32] Q_PROPERTY 매크로 (6) 구름님 07-09 7666 2
 1  2  3  4  5  6  7  


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