[STL] vector의 여러가지 사용법 및 설명
vector 초기화
// 벡터 생성
vector<자료형> 변수명;
vector<int> v; //int형 백터 생성
// 숫자만큼 벡터 생성 후 0으로 초기화
vector<int> num(0);
vector<int>v(4); //int형 백터 생성 후 크기를 4로 할당(모든 백터요소 0으로 초기화)
// 벡터 생성 후 오른쪽 변수 값으로 초기화
vector<int> num = { 변수1, 변수2, 변수3...}
vector<int>v = { 1, 2, 3}; //int형 백터 생성 후 1, 2, 3 으로 초기화
// 벡터 배열(2차원 벡터)선언 및 초기화 (열은 고정, 행은 가변)
vector<int> num[] = {, };
vector<int>v[] = {{ 1, 2}, {3, 4}}; //int형 백터 배열 생성(행은 가변이지만 열은 고정)
// 2차원 벡터 생성(열과 행 모두 가변)
vector<vector<int>> num;
vector<vector<int>> v; //2차원 백터 생성(행과 열 모두 가변)
// 벡터의 범위 내에서 해당 값으로 초기화
vector<int> num.assign(범위, 초기화할 값);
vector<int> v = { 1, 2, 3, 4, 5}; //백터 범위를 5로 지정하고 정수 10으로 초기화
C++
복사
vector의 iterators
v.begin()
v.end()
// 벡터의 끝 지점을 시작점으로 반환
v.rbegin() (revers begin)
// 벡터의 (시작+1) 지점을 끝 부분으로 반환
v.rend() (revers end)
C++
복사
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main(){
vector<int> v = { 1, 2, 3, 4 };
for_each(v.begin(), v.end(), [&](int& n){
cout << n << endl; //output : 1 2 3 4
});
for_each(v.rbegin(), v.rend(), [&](int& n) {
cout << n << endl; //output : 4 3 2 1
});
////////////////////////////////////////////////////
vector<int>::iterator itor = v.begin();
for (; itor != v.end(); itor++)
cout << *itor << endl; //output : 1 2 3 4
vector<int>::reverse_iterator itor2 = v.rbegin();
for (; itor2 != v.rend(); itor2++)
cout << *itor2 << endl; //output : 4 3 2 1
}
C++
복사
vector 요소 접근
// 벡터의 i번째 요소 접근 (범위 검사함)
v.at(i)
// 벡터의 i번째 요소 접근 (범위 검사 안함)
v[i]
// 벡터의 첫 번째 요소 접근
v.front()
// 벡터의 마지막 요소 접근
v.back()
C++
복사
vector<int> v = {1, 2, 3, 4};
cout << v.front() << endl; //output : 1
cout << v.back() << endl; //output : 4
cout << v.at(1) << endl; //output : 2
cout << v[2] << endl; //output : 3
C++
복사
vector에 요소 삽입
v.push_back();
// 벡터의 마지막 부분 제거
v.pop_back();
// 사용자가 원하는 위치에 요소 삽입
v.insert(삽입할 위치의 주소 값, 넣을 값)
// 사용자가 원하는 위치에 요소 삽입 (move로 인해 복사생성자 x)
v.emplace(삽입할 위치의 주소 값, 넣을 값)
// 벡터의 마지막 부분에 새로운 요소 추가 (move로 인해 복사생성자 x)
v.emplace_back()
// 사용자가 원하는 index값의 요소를 지운다
v.erase(삭제할 위치);
v.erase(시작위치, 끝위치);
// 벡터의 모든 요소를 지운다 (return size = 0)
v.clear();
// 벡터의 사이즈를 조정한다 (범위 초과시 0으로 초기화)
v.resize(수정 값);
// 벡터와 벡터를 스왑한다
v.swap(벡터 변수);
C++
복사
#include <vector>
int main(){
vector<int> v;
v.push_back(10);
v.push_back(20); //v = { 10, 20 }
v.inset(v.begin() + 1, 100); // v = { 10, 100, 20 }
v.pop_back(); // v = { 10, 100 }
v.emplace_back(1); //v = { 10, 100, 1 }
v.emplace_back(2); //v = { 10, 100, 1, 2 }
v.emplace(v.begin() + 2, -50); //v = { 1, 100, -50, 1, 2 }
v.erase(v.begin() + 1); // v = { 1, -50, 1, 2 }
v.resize(6); // v = { 1, -50, 1, 2, 0, 0 }
v.clear(); // v = empty()
}
C++
복사
•
vector에 대한 복사생성자와 move
•
기본적으로 push_back() 함수는 값을 넣는 과정에서 복사생성자를 호출하게 된다
•
뿐만 아니라, insert를 하게 된다면, 모든 값들을 새로운 메모리에 복사한 후, 해당 자리에 값을 넣게 된다
•
이렇게 되버리면, 복사생성자로 인한 오버헤드가 커지게 되며, 성능 저하를 야기한다
•
그래서 나온 것이 emplace와 emplace_back 이다
•
emplace와 emplace_back은 벡터 내부에서 값들을 생성하는 것이다
→ 즉, 생성자만 호출 된다
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class A {
private:
int num;
string name;
public:
A(int i, string s) : num(i), name(s) {}
};
int main(void) {
vector<A> v;
A a(1, "hwan");
v.push_back(1, "hi"); // error -> v.push_back(a);
v.emplace_back(1, "hi"); // ok!!
return 0;
}
C++
복사
•
A 클래스가 있다. 해당 클래스는 인자로 int, string을 받는다
•
벡터 v는 해당 클래스를 담을 수 있는 배열이다
•
v.push_back(1, "hi"); 이 코드는 삽입이 되지 않는다.
•
push_back은 내부적으로 템플릿<T>에 대한 생성자 호출을 지원하지 않기 떄문이다
•
따라서 일반적으로 선언된 a라는 변수를 넣게되며, 넣을 때 복사생성자가 호출이 된다
•
하지만 emplace_back() 같은 경우에는 v.emplace_back(1, “hi”);를 넣어주고 있는데 컴파일이 된다
•
그 이유는 내부적으로 템플릿<T>에 대한 생성자 호출을 해주기 때문에 편하고, 복사생성자의 호출없이 바로 입력이 가능해지기 때문이다
•
내부적으로 생성자를 지원하는 함수는 emplace와 emplace_back이 유일(권장)
vector cpapcity
// 벡터가 빈 공간이면 true, 값이 있다면 false
v.empty();
v.size();
// heap에 할당된 벡터의 실제크기(최대크기) 반환
v.capacity();
// 벡터가 system에서 만들어 질 수 있는 최대 크기 반환
v.max_size();
// 벡터의 크기 설정
v.reserve(숫자);
// capacity의 크기를 벡터의 실제 크기에 맞춤
v.shrink_to_fit();
C++
복사
vector<int>v = { 1, 2, 3, 4 };
cout << v.size() << endl; //output : 4
cout << v.capacity() << endl; //output : 10 (컴파일 환경에 따라 달라질 수 있음)
v.reserve(6);
cout << v.capacity() << endl; //output : 6
cout << v.max_size() << endl; //output : 1073741823(시스템 성능에 따라 달라질 수 있음)
v.shrink_to_fit();
cout << v.capacity() << endl; //output : 4
cout << v.empty() << endl; //output : false
v.clear();
cout << v.empty() << endl; //output : true
C++
복사