벡터는 요소가 삽입되거나 삭제 될 때 컨테이너가 자동으로 처리하는 저장소를 사용하여 요소의 크기를 자동으로 조정할 수 있는 동적 배열과 동일하다. 벡터 요소는 연속 저장 장치에 저당되므로 반복자를 사용하여 액세스하고 순회 할 수 있다.
일반적으로 벡터에는 데이터를 끝에 추가 한다. 중간에 데이터를 넣거나 삭제하면 이후의 배열을 확장하거나 축소해야 할 수도 있기 때문에 시간적 비용이 따른다. 마지막 요소를 제거할 때는 크기 조정이 발생하지 않기 때문에 일정한 시간 만 걸린다.
다음은 간단한 사용 방법 및 주요 함수를 설명한다.
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 컨테이너가 없다.