[표준 템플릿 라이브러리(STL)]
c++ 표준 라이브러리에는 다수의 클래스 템플릿과 함수 템플릿이 마련된다.
[컨테이너]
컨테이너는 자료를 저장하는 창고와 같은 역할을 하는 구조이다.
즉 배열이나 연결 리스트, 벡터, 집합, 사전, 트리 등이 여기에 해당한다.
- 컨테이너의 분류
[반복자]
컨테이너의 요소를 가리키는 데 사용된다. 일반화된 포인터 (generalized pointer)
STL 알고리즘은 반복자를 통하여 컨테이너에 접근하여 작업한다.
- 반복자의 연산자
- 컨테이너에서 다음 요소를 가리키기 위한 ++연산자
- 컨테이너에서 이전 요소를 가리키기 위한 --연산자
- 두개의 반복자가 같은 요소를 가리키고 있는 지를 확인하기 위한 ==와 != 연산자
- 반복자가 가리키는 요소의 값을 추출하기 위한 역참조 연산자 *
[vector 클래스]
배열의 단점을 보완한 컨테이너로 실행 시간에 크기를 변경할 수 있는 동적 배열이다.
추가되는 요소의 개수에 따라서 자동적으로 크기가 조절된다.
벡터 = 가변길이 배열
벡터를 사용하기 위해서는 #include <vector>을 추가해야 한다.
[백터의 선언과 초기화]
- 벡터 선언
- 벡터 초기화
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v1(10); // 10칸을 0으로 초기화
vector<int> v2(10, 1); // 10칸을 1으로 초기화
vector<int> v3;
// v3[1] = 3; 이렇게 접근하고 싶으면 먼저 길이를 만들어야함
}
[벡터의 동작 원리]
여유분을 두고 메모리를 할당한다. 여유분까지 꽉 찼으면, 기존의 영역을 버리고 기존의 size에서 약 1.5배(visual studio 기준) 사이즈로 새로운 영역을 만든다 (이사를 간다고 생각하면 쉽다)
v.capacity() - 여유분을 포함한 총 용량의 개수
v.size() - 실제 사용하고 있는 데이터 개수
* capacity는 늘면 늘지, 줄어들지는 않는다. v.clear()을 해도 줄어들지 않는다!
[복사 비용을 줄이기]
필요한 사이즈를 대략 알면 reserve() 또는 resize()를 사용하여 capacity를 설정하면 된다.
v.resize(n) - 크기를 n개로 변경한다. 커진 경우에는 빈 곳을 0으로 초기화 한다.
v.resize(n, m) - 크기를 n개로 변경한다. 커진 경우에는 빈 곳을 m으로 초기화 한다..
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v4;
v4.reserve(1000);
// 필요한 사이즈를 대략 알면reserve() 또는 resize()를 사용하여 capacity를 설정해야한다.
// 현재 v4의 capacity가 1000으로 처음부터 잡힘, 사이즈는 변화하진 않는다.
for (int i = 0; i < 1000; i++)
{
v4.push_back(100);
cout << v4.size() << " " << v4.capacity() << endl;
}
}
[백터 클래스 멤버함수]
push_back(데이터) | 벡터 끝 부분에 데이터 추가 |
pop_back() | 벡터 끝 부분에서 데이터를 삭제 |
front() | 벡터 맨 앞에 값 반환 |
back | 벡터 맨 뒤에 값 반환 |
insert(반복자, 데이터) | 반복자 위치 앞에 데이터 삽입 |
erase(주소) erase(주소1, 주소2) |
주소 위치 데이터만 삭제 주소 1에서 주소 2앞까지 데이터 삭제 |
empty() | 벡터 안에 데이터 존재 안 하면 true리턴 |
size() | 벡터 안 데이터의 개수를 리턴 |
at(index) 벡터객체이름[index] |
벡터의 원소를 참고 |
clear() | 벡터의 원소를 모두 제거 |
[반복자 (iterator)]
벡터와 달리 다른 컨테이너는 v[i]와 같이 인덱스 접근이 안될 수도 있다.
iterator는 모든 컨테이너에 공통적으로 접근할 수 있는 방법이다.
(v.begin()는 반복자만 쓸 수 있음)
begin() | 벡터의 첫 iterator(=첫 원소의 주소)를 리턴 |
end() | 벡터의 끝 iterator(=마지막 원소 다음 주소)를 리턴 |
*참고 사진
[반복자를 사용하는 다양한 방식]
vector<int>::iterator it = v.begin();
while (it != v.end())
{
cout << *it;
cout << " ";
}
cout << endl;
for (auto it = v.begin(); it != v.end(); it++)
{
cout << *it;
cout << " ";
}
cout << endl;
for (auto it : v)
{
cout << it;
cout << " ";
}
cout << endl;
참고만 하기 바람.
[2차원 벡터]
배열 요소들이 2차원으로 나열된 배열이다.
'C++ 자료구조' 카테고리의 다른 글
[c++] 연산자 중복 (오버로딩) (0) | 2024.04.02 |
---|---|
[c++] 클래스 (Class) (0) | 2024.04.01 |
[c++] 배열 (0) | 2024.03.25 |
[c++] 제어 구조와 함수 (0) | 2024.03.19 |
[c++] 문자열(string) (0) | 2024.03.12 |