한국어
Qt
 

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

makersweb 2020.03.17 23:55 조회 수 : 3644

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

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

 

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

 

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 91473
120 UI 폼(Form)작성 시 탭 순서(Tab Order) 설정 file makersweb 2020.08.24 4156
119 Qt로 데이터를 직렬화(serialization)하는 방법 makersweb 2020.08.04 2989
118 최초의 Qt 6.0 스냅샷 제공 (First Qt 6.0 Snapshot Available) j2doll 2020.06.21 1339
117 Qt MQTT 에 대해서 file makersweb 2020.06.02 1712
116 Embedded Linux 에서 Qt 및 Graphics Stack file 운영자 2020.05.27 1395
115 ShaderEffect QML Type을 이용한 버튼 클릭 효과 file makersweb 2020.05.22 1940
114 Qt기반의 서버와 클라이언트간 SOAP(Simple Object Access Protocol) file makersweb 2020.05.11 1838
113 재진입(Reentrancy) 및 스레드 안전성(Thread-Safety) makersweb 2020.04.19 1836
112 Qt 5.15 및 Qt 6의 출시 일정 makersweb 2020.04.09 1612
111 콘솔에서 사용자 입력받기 file makersweb 2020.03.22 52804
» 컨테이너 클래스 - QVector makersweb 2020.03.17 3644
109 Qt로 작성된 안드로이드 APP에 Splash Screen을 추가 file makersweb 2020.03.10 1611
108 QLabel의 텍스트 색과 배경색을 변경 makersweb 2020.02.25 8058
107 라즈베리파이4에 대한 Qt 5.14.1 크로스컴파일 [1] file makersweb 2020.02.12 5290
106 QOpenGLWidget 을 투명하게 적용 file makersweb 2020.02.05 1982
105 2020년에 변경되는 Qt 오퍼 (Qt offering changes 2020) [2] j2doll 2020.01.31 1439
104 Qt로 XML 파싱 : Qt 6에서 업데이트된 (Parsing XML with Qt: Updates for Qt 6) [1] j2doll 2020.01.16 1732
103 Qt 멀티 스레드 프로그래밍 시 유의해야 할 몇 가지 makersweb 2020.01.13 5953
102 ApplicationWindow 와 메뉴바(MenuBar)구성 file makersweb 2020.01.04 2275
101 QThread 소개 및 예제 makersweb 2019.12.25 21497