Search

[STL] vector의 여러가지 사용법 및 설명

생성일
2023/02/10 08:11
태그
C++

[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를 하게 된다면, 모든 값들을 새로운 메모리에 복사한 후, 해당 자리에 값을 넣게 된다
이렇게 되버리면, 복사생성자로 인한 오버헤드가 커지게 되며, 성능 저하를 야기한다
그래서 나온 것이 emplaceemplace_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++
복사

reference