한국어
Qt
 

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

makersweb 2020.03.17 23:55 조회 수 : 2824

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

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

 

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

 

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 85787
138 Qt 6 에서 프로퍼티 바인딩 makersweb 2021.04.03 769
137 QML과 JavaScript 의 숫자 관련 내장된 함수 makersweb 2021.03.28 1388
136 Qt 5 코드를 Qt 6로 포팅하기 위해 도움이 되는 Clazy Framework file makersweb 2021.03.01 919
135 C++로 작성한 클래스를 QML에서 생성 file makersweb 2021.02.10 5270
134 Qt MQTT의 pus/sub 튜토리얼 file makersweb 2021.02.06 1637
133 Qt 를 사용하거나 기반으로 하는 응용프로그램 file makersweb 2021.01.30 3782
132 Loader를 사용하여 동적으로 QML 로드 makersweb 2021.01.19 1806
131 QThread 및 QMutex 예제 makersweb 2021.01.12 1340
130 그래픽 소프트웨어에서 디자인 내보내기 (Exporting Designs from Graphics Software) j2doll 2020.12.25 413
129 Qt5Compat 라이브러리를 사용하여 Qt5에서 Qt6로 포팅 [2] makersweb 2020.12.05 669
128 Qt Quick Controls 2에 네이티브 데스크탑 스타일 추가 file makersweb 2020.11.23 486
127 QML 바인딩 끊김 진단 makersweb 2020.11.08 908
126 QML과 코루틴(Coroutines) makersweb 2020.11.03 577
125 Qt 6의 비동기 API makersweb 2020.10.19 1198
124 QRandomGenerator 클래스를 사용하여 난수(random values) 생성 makersweb 2020.10.17 1569
123 Qt 6에서 QList 변경사항 makersweb 2020.10.08 973
122 Qt 6.0의 개발 호스트 및 대상 플랫폼 makersweb 2020.09.16 976
121 main함수 명령줄 옵션 해석 makersweb 2020.09.01 2227
120 UI 폼(Form)작성 시 탭 순서(Tab Order) 설정 file makersweb 2020.08.24 2766
119 Qt로 데이터를 직렬화(serialization)하는 방법 makersweb 2020.08.04 2050