프로그래밍/Morden C++

자주 쓰이는 vector 사용 패턴

MAKGA 2021. 7. 11. 21:41
320x100
#include <vector>

 

벡터 생성 및 초기화

// 1차원
// 디폴트 생성자
vector<int> vec;
// 원소 10개를 zero 초기화(0, 0.0, nullptr..)
vector<int> vec(10);
// 원소 10개를 3으로 초기화
vector<int> vec(10, 3);
// 이니셜라이저 리스트 생성
vector<int> vec({1, 2, 3});
// 유니폼 초기화
vector<int> vec = {1, 2, 3};
vector<int> vec{1, 2, 3};
// 힙에 생성
auto vec = std::make_unique<vector<int>>(10);
// int타입 벡터 배열(크기 : 10) 생성
vector<int> vec[10];
// int형 백터 배열 생성(행은 가변이지만 열은 고정)
vector<int> vec[] = {{1, 2}, {3, 4}};
// 벡터 vec을 복사하여 vec2 생성
vector<int> vec2(v);
// 벡터 vec의 일부를 복사하여 vec2 생성
vector<int> vec2(v.begin(), v.end()+3);

// 2차원
// int타입 2차원 벡터 생성
std::vector<std::vector<int>> vec2d;
// 3으로 초기화된 크기 10 의 벡터를 10개 생성
std::vector<std::vector<int>> vec2d(10, std::vector<int>(10, 3));

 

벡터 복제 / 대입

// 이전에 저장된 원소를 모두 삭제하고 값 10인 원소 5개 추가
vec.assign(5, 10);
vec.assign({1, 2, 3});
// 내용 맞바꾸기(상수 시간)
vec.swap(vec2);

 

벡터 원소 추가/제거

// 원소 추가
vec.push_back(1);
// 원소 추가
vec.emplace_back(1);// 임시 객체의 생성자를 적게 호출할 수 있다고 알려져 있지만 push_back에서도 내부에서 emplace_back를 호출하기 때문에 의미없다.
// 원소 추가
vec.insert(5);
// 원하는 위치에 추가(반복자)
vec.insert(iter, 10);
// 원하는 위치에 벡터를 추가
std::vector<int> vec2(2, 400);
vec.insert(iter, vec2.begin(), vec2.end());

// 삭제
vec.pop_back();
// i번째 특정 위치 요소 제거
vec.erase(vec.begin() + i);
// remove
vec.erase(std::remove(vec.begin(), vec.end(), 1), vec.end());
// remove_if
vec.erase(std::remove_if(vec.begin(), vec.end(), [](int n) { return n%2 == 0; }), vec.end());

 

벡터 접근 방법

// 직접 접근 - 범위의 체크 없음
vec[0];
vec[0][0];

// 간접 접근 - 범위의 체크
vec.at(0);
vec.at(0).at(0);

// 반복자
std::vector<int>::iterator iter = vec.begin();
iter += 5;
--iter;
auto& citer = vec.cbegin(); // const

 

벡터 출력

for_each(vec.begin(), vec.end(),
	[](const int& n) { cout << n << " "; });

 

벡터에 값 채우기 (first부터 second까지 third로 채움)

#include <algorithm> // std:fill
std::fill(vec.begin(), vec.end(), 1);

 

벡터 크기(메모리) 변경하기

vec.reserve(10);

 

벡터 사이즈 변경하기

vec.resize(10);

 

벡터 초기화 하기(메모리)

std::vector<int>().swap(vec);

 

벡터 정렬

#include <algorithm> // std::sort
#include <functional> // std::less, greater

// 기본(오름차순)
std::sort(vec.begin(), vec.end()); // 1 2 3 4 5 6 7 ...
// 오름차순
std::sort(vec.begin(), vec.end(), std::less<int>()); // 1 2 3 4 5 6 7 ...
// 내림차순
std::sort(vec.begin(), vec.end(), std::greater<int>()); // 9 8 7 6 5 4 ...

//커스텀 함수(오름차순)
bool compare(int a, int b) {
	return a < b;
}
std::sort(vec.begin(), vec.end(), comapre);

// 커스텀 객체 정렬(오름차순)
class CustomObject
{
	bool operator <(CustomObject& a) {
		return this->val < b.val;
	}
};

 

벡터 중복값 제거

#include <algorithm> // std::sort
// 선 정렬
std::sort(vec.begin(), vec.end());
// 중복 지점부터 끝까지 삭제
vec.erase(std::unique(vec.begin(),vec.end()), vec.end());

그림 설명: https://kkaeruk.tistory.com/19

 

[C++ STL : vector] 벡터 중복원소 제거

안녕하세요 ~ 깨륵입니다 '▽'/ 벡터 세번째 시간이네요ㅎㅎ 이번에는 벡터에서 중복원소를 제거하는 간단한 코드를 가져왔습니다! 한번 보러 가실까요? 혹시 벡터 기본 사용법이 익숙치 않다면

kkaeruk.tistory.com

320x100

'프로그래밍 > Morden C++' 카테고리의 다른 글

std::clamp  (0) 2021.09.29
std::accumulate  (0) 2021.09.22
[C++17] std::optional  (0) 2021.07.17
std::splice  (0) 2021.07.13
std::advance  (0) 2021.07.13