한국어
Qt
 

C++ Class 컨테이너 클래스 - QVector

makersweb 2020.03.17 23:55 조회 수 : 2816

벡터는 요소가 삽입되거나 삭제 될 때 컨테이너가 자동으로 처리하는 저장소를 사용하여 요소의 크기를 자동으로 조정할 수 있는 동적 배열과 동일하다. 벡터 요소는 연속 저장 장치에 저당되므로 반복자를 사용하여 액세스하고 순회 할 수 있다.

일반적으로 벡터에는 데이터를 끝에 추가 한다. 중간에 데이터를 넣거나 삭제하면 이후의 배열을 확장하거나 축소해야 할 수도 있기 때문에 시간적 비용이 따른다. 마지막 요소를 제거할 때는 크기 조정이 발생하지 않기 때문에 일정한 시간 만 걸린다.

 

다음은 간단한 사용 방법 및 주요 함수를 설명한다.

 

QVector는 항목을 배열에 저장한다. 일반적으로 벡터는 초기 크기로 생성된다. QVector를 초기화하는 몇가지 방법을 보여 알아보자.

 

정수를 포함하는 QVector

QVector<int> v {1, 2, 3, 4};

 

다음 코드는 200개의 QString 요소로 QVector를 생성한다.

QVector<QString> vector(200);

 

요소는 기본 구성 값으로 자동 초기화된다. 다른 값으로 벡터를 초기화하려면 해당 값을 생성자에 두 번째 인수로 전달한다.

QVector<QString> vector(200, "Pass");

 

prepend() - 벡터의 시작 부분에 값을 추가.

QVector<QString> vector;
vector.prepend("one");
vector.prepend("two");
vector.prepend("three");
// vector: ["three", "two", "one"]

 

append() - 벡터의 끝에 값을 추가.

QVector<QString> vector;
vector.append("one");
vector.append("two");
QString three = "three";
vector.append(three);
// vector: ["one", "two", "three"]
// three: "three"

 

insert() - 벡터의 인덱스 위치 i에 값을 추가.

QVector<double> vector;
vector << 2.718 << 1.442 << 0.4342;
vector.insert(1, 3, 9.9);
// vector: [2.718, 9.9, 9.9, 9.9, 1.442, 0.4342]

 

data() - 벡터에 저장된 데이터에 대한 포인터를 반환.

QVector<int> vector(10);
int *data = vector.data();
for (int i = 0; i < 10; ++i)
    data[i] = 2 * i;

 

 

그외 벡터와 관련된 기능은 다음과 같다.

 

first()- 벡터의 첫 번째 항목에 대한 참조를 반환하며 벡터가 비어 있지 않다고 가정.

front() - 이 기능은 STL 호환성을 위해 제공. first()와 같음.

last() - 벡터의 마지막 항목에 대한 참조를 반환

back() - STL 호환성을 위해 제공되며 last()와 같다.

begin() – 벡터의 첫 번째 요소를 가리키는 반복자를 반환

end() – 벡터의 마지막 요소 다음에 오는 이론적 요소를 가리키는 반복자를 반환

indexOf() - 벡터에서 처음 나타나는 값의 인덱스 위치를 인덱스 위치에서 앞으로 검색하여 반환. 일치하는 항목이 없으면 -1을 반환.

QVector<QString> vector;
vector << "A" << "B" << "C" << "B" << "A";
vector.indexOf("B");            // returns 1
vector.indexOf("B", 1);         // returns 1
vector.indexOf("B", 2);         // returns 3
vector.indexOf("X");            // returns -1

 

rbegin() – 벡터의 마지막 요소를 가리키는 역 반복자를 반환(역으로 시작). 마지막 요소에서 첫 번째 요소로 이동

rend() – 벡터에서 첫 번째 요소 앞에있는 이론적 요소를 가리키는 역 반복자를 반환(역 끝으로 간주).

cbegin() – 벡터의 첫 번째 요소를 가리키는 상수 반복자를 반환.

cend() – 벡터의 마지막 요소 다음에 오는 이론적 요소를 가리키는 상수 반복자를 반환.

crbegin() – 벡터의 마지막 요소를 가리키는 상수 역 반복자를 반환(역으로 시작). 마지막 요소에서 첫 번째 요소로 이동.

crend() – 벡터에서 첫 번째 요소 앞에있는 이론적 요소를 가리키는 상수 역 반복자를 반환(역 끝으로 간주).

clear() - 벡터에서 모든 요소를 ​​제거.

move() - 인덱스 위치에 있는 항목을 인덱스 위치로 이동.

remove() - 인덱스 위치 i에서 요소를 제거

isEmpty() - 벡터의 크기가 0이면 true를 반환. 그렇지 않으면 false를 반환.

empty() - 벡터가 비어 있으면 true를 반환. isEmpty ()와 같다.

resize() - 벡터 크기를 size로 설정. 크기가 현재 크기보다 크면 요소가 끝에 추가되고 기본 구성 값으로 초기화.

size() - 벡터의 항목 수를 반환

length() - size()완 같음. QList와의 호환성을 제공.

swap() - 해당 벡터와 다른 벡터를 바꿈. 이 작업은 매우 빠르며 절대 실패하지 않는다.

QVector<T> v ...;
QVector<T>().swap(v);
Q_ASSERT(v.capacity() == 0);

 

takeAt() - 인덱스 위치 i에서 요소를 제거하고 리턴.

takeFirst() - 벡터에서 첫 번째 항목을 제거하고 반환. 이 함수는 벡터가 비어 있지 않다고 가정. 

takeLast() - 목록에서 마지막 항목을 제거하고 반환. 이 함수는 벡터가 비어 있지 않다고 가정.

 

Qt 컨테이너 및 해당 STL 대응

 

Qt는 자체 컨테이너 클래스 세트를 제공하며 STL 클래스와 유사하지만 작지만 미묘한 차이가 있다. Qt 프로그래머는 언제 어떤 Qt 컨테이너 클래스를 사용해야하는지 이해하는 것이 중요하다.

 

다음 표는 주요 순차 및 연관 Qt 컨테이너와 해당 STL 대응 항목을 나타낸다. 

Qt

 

STL

 

순차적 컨테이너

 

QVector

 

std::vector

 

 

std::deque

 

QList

 

 

QLinkedList

 

std::list

 

 

std::forward_list

 

연관된 컨테이너

 

QMap

 

std::map

 

QMultiMap

 

std::multimap

 

 

std::set

 

 

std::multiset

 

QHash

 

std::unordered_map

 

QMultiHash

 

std::unordered_multimap

 

QSet

 

std::unordered_set

 

 

std::unordered_multiset

 

 

보다시피 std::deque, std::forward_list 및 std::{multi,} set에 해당하는 Qt 컨테이너가 없으며 QList와 비슷한 STL 컨테이너가 없다.

 
번호 제목 글쓴이 날짜 조회 수
공지 Qt프로그래밍(QtQuick) Beginner를 위한 글 읽는 순서 운영자 2019.01.05 85726
178 가상키보드(Qt Virtual Keyboard)를 사용하는 방법 [32] file makersweb 2019.05.03 220762
177 콘솔에서 사용자 입력받기 file makersweb 2020.03.22 51837
176 QString 문자열 다루기 예제 운영자 2019.01.26 39939
175 Windows에서 Qt 설치 따라하기 file makersweb 2019.10.14 30848
174 Qt의 시그널 슬롯 시스템 file makersweb 2015.10.20 23538
173 QThread 소개 및 예제 makersweb 2019.12.25 19388
172 QtCreator Design으로 GUI만들기 (QML로 만드는 Hello World -2) [1] file makersweb 2019.05.26 14837
171 초보자를 위한 첫번째 프로젝트 - QML로 만드는 Hello World file makersweb 2018.03.16 14426
170 Qt 프로그래밍의 시작 makersweb 2015.10.25 14359
169 Qml과 C++로 구현하는 GUI어플리케이션 file makersweb 2018.12.25 13904
168 QML과 QtQuick 모듈 개념과 기본 타입들 makersweb 2019.04.26 13374
167 Windows에서 라즈베리파이3용 Qt5.10.0 크로스컴파일 [20] file makersweb 2018.02.23 12864
166 Qt의 오픈소스 라이센스 소개 file makersweb 2019.12.15 12522
165 Qml 기본 컴포넌트 강좌 (1) file makersweb 2019.01.03 12046
164 QtSerialPort를 사용한 시리얼(Serial)통신 [3] makersweb 2019.05.21 11864
163 Qt Installer Framework - 패키징, 설치프로그램 제작 file makersweb 2018.10.14 11644
162 Qt 응용프로그램 배포(windows) file makersweb 2018.10.10 11289
161 Ubuntu Linux에서 Qt Creator 설치 file makersweb 2016.03.06 10665
160 Qt의 스레드간 시그널 슬롯의 커넥션타입 [1] makersweb 2015.10.24 10151
159 QML 강좌 - 동적 Listing (ListView) file makersweb 2019.06.01 10074