한국어
Qt
 

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

makersweb 2020.03.17 23:55 조회 수 : 3008

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

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

 

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

 

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 87662
119 안드로이드 가상장치 사용 file makersweb 2019.01.13 1181
118 QMake 프로젝트를 CMake 프로젝트로 변환 with qmake2cmake makersweb 2022.09.17 1187
117 Qml에서 커튼효과 구현 예제 - Shader Effects file 운영자 2018.12.05 1212
116 QProcess 예제 (프로그램 재시작) file makersweb 2023.01.25 1233
115 Qt 6의 비동기 API makersweb 2020.10.19 1314
114 많은 리소스를 사용하는 Qt프로젝트에서 고려해봐야 할 qmake 옵션 makersweb 2019.10.11 1318
113 Qt 하이브리드 애플리케이션(Hybrid App) 개발 file makersweb 2023.02.08 1326
112 재진입(Reentrancy) 및 스레드 안전성(Thread-Safety) makersweb 2020.04.19 1351
111 Qt 스마트 포인터 (QSharedPointer, QScopedPointer, QPointer) makersweb 2022.08.18 1364
110 웹기반 Qt Design Viewer [2] file makersweb 2019.10.23 1397
109 tslib의 ts_calibrate를 응용해서 Qt로 터치보정기능 구현 file makersweb 2019.04.06 1462
108 qInstallMessageHandler를 이용한 디버그 메세지 출력 제어하기 makersweb 2019.02.25 1470
107 QThread 및 QMutex 예제 makersweb 2021.01.12 1477
106 Qbs에 대한 소개와 설치하는 방법 makersweb 2019.10.09 1485
105 싱글터치 스크린 및 임베디드 리눅스 기반에서 Qt 터치입력 makersweb 2018.12.24 1511
104 QML과 JavaScript 의 숫자 관련 내장된 함수 makersweb 2021.03.28 1557
103 Qt Quick 3D 소개 makersweb 2019.11.09 1581
102 QML에서 undefined를 확인하는 방법 makersweb 2017.11.29 1603
101 ApplicationWindow 와 메뉴바(MenuBar)구성 file makersweb 2020.01.04 1615
100 Widgets(C++) 기반의 기본 스타일을 Dark 테마 및 Material 디자인 스타일로 바꾸기 file makersweb 2023.01.28 1630