티스토리 뷰
벡터(Vector)란?
크기가 변할 수 있는 배열을 나타내는 시퀀스 컨테이너이다.
Vectors are sequence containers representing arrays that can change in size.
쉽게 말해 동적으로 그 사이즈를 조절 가능할 수 있는 배열을 의미한다.
벡터를 사용하기 위해서는 <vector> 헤더를 include 해주어야 한다.
편의상 아래 코드에 vector 헤더와 using namespace std; 선언을 해주었다고 가정한다.
#include <vector>
using namespace std;
1차원 벡터 선언 및 초기화
기본 벡터 선언 방법이다. 내부 자료형을 int로 하는 벡터 v를 선언한다. 이때는 비어있는 벡터 v가 생성된다.
당연히 비어있기 때문에 사이즈도 0이다.
vector<int> v;
cout << v.size(); // 실행 결과 : 0
크기가 5인 벡터의 선언 방법이다. 이때 요소들의 기본 값은 0이다.
vector<int> v(5);
cout << v.size(); // 실행결과 5
cout << v[0] << ' ' <<v[1] << endl; // 실행결과 0 0
크기가 5이고, 벡터 요소들의 값을 동시에 3으로 초기화하는 선언 방법이다.
vector<int> v(5, 3);
cout << v.size(); // 실행결과 5
cout << v[0] << ' ' <<v[1] << endl; // 실행결과 3 3
다른 벡터를 복사해서 생성하는 방법이다.
vector<int> v(5, 3);
cout << v.size(); // 실행결과 5
cout << v[0] << ' ' <<v[1] << endl; // 실행결과 3 3
vector<int> copy(v);
cout << copy.size(); // 실형결과 5
cout << copy[0] << ' ' << copy[1] << endl; // 실행결과 3 3
2차원 벡터 선언 및 초기화
vector<int> v;
이 의미는 요소들의 자료형이 int인 벡터 v를 선언한다는 의미이다.
그렇다면 2차원 벡터의 경우 요소들이 벡터 여야 한다. 다시 말해 2차원 벡터 matrix를 선언한다고 할 때,
// 설명을 위한 코드입니다 실행불가
vector<> matrix = {
vector<> v1,
vector<> v2,
vector<> v3
}
이런 식으로 구성이 된다는 것이고, 요소들이 모두 벡터이다. 그렇다면 matrix의 요소에 vector <>가 들어가야 할 것이다.
// 설명을 위한 코드입니다 실행불가
vector<vector<>> matrix = {
vector<> v1,
vector<> v2,
vector<> v3
}
결론적으로, 각 요소 벡터들이 int 자료형을 가지는 데이터를 요소로 가진다고 하였을 때, 아래와 같이 구성될 것이다.
// 설명을 위한 코드입니다 실행불가
vector<vector<int>> matrix = {
vector<int> v1,
vector<int> v2,
vector<int> v3
}
따라서, 다시 2차원 배열 선언으로 돌아가면
vector<vector<int>> matrix;
cout << matrix.size(); // 실행결과 0
위 코드는 'int 자료형 데이터를 요소를 가지는 벡터'들을 요소로 가지는 벡터 matrix이다. 다만 아무런 초기화를 진행하지 않았기 때문에 그냥 빈 배열이다. 즉, 현재 matrix 상태는 {}와 다를 게 없다.
여기서 벡터 assign을 활용한다면,
vector<vector<int>> matrix(5);
cout << matrix.size(); // 실행결과 5
5개의 원소를 가지는 matrix, 여기까지의 matrix상태는 {{}, {}, {}, {}, {}}이다.
그렇다면 각 원소인 int를 자료형으로 가지는 벡터 요소들까지 초기화해준다면?
vector<vector<int>> matrix(5, vector<int> (5,3));
cout << matrix.size() << endl; // 실행결과 5
for(int i=0; i<matrix.size();i++){
for(int j=0; j<matrix[0].size(); j++){
cout << matrix[i][j] << ' ';
}
cout<<endl;
}
// 실행결과
// 3 3 3 3 3
// 3 3 3 3 3
// 3 3 3 3 3
// 3 3 3 3 3
// 3 3 3 3 3
matrix 상태는 아래와 같다.
{{3,3,3,3,3},
{3,3,3,3,3},
{3,3,3,3,3},
{3,3,3,3,3},
{3,3,3,3,3}}
2차원 벡터의 선언 후 초기화
벡터를 선언 후, 재 초기화할 일이 없다면 상관없지만, 보통 다시 초기화가 필요할 때 사용할 수 있는 방법들이다.
* init함수 구현
직접 초기화해주는 방법으로, 벡터의 요소들 마다 특정 규칙으로 다르게 세팅해줘야 한다거나 할 때 사용할 수 있는 방법이다.
void init(vector<vector<int>> &matrix)
{
for(int i=0; i<matrix.size();i++){
for(int j=0; j<matrix[0].size(); j++){
matrix[i][j] = 7;
}
}
}
* Algorithm 헤더의 fill 사용
fill 함수는 배열이나 벡터 같은 연속성을 띈 자료구조의 시작점부터 연속된 범위를 어떤 값이나 객체로 모두 지정하고 싶을 때 사용하는 함수이다. 함수의 원형은 아래와 같다.
#include <algorithm>
void fill (ForwardIterator first, ForwardIterator last, const T& val);
first는 채우고자 하는 자료구조의 시작 위치, last는 끝 위치이다. val은 채우고자 하는 값으로 객체가 들어갈 수도 있다.
// 처음에는 [0][0]을 써주고, 그 다음 칸에는 [최대 행(값) - 1][최대 열]
fill(&matrix[0][0], &matrix[MAX - 1][MAX], 7);
주의할 점은, matrix.begin()과 matrix.end()를 사용하고 싶을 때는, val에 vector를 적어야 한다.
matrix는 2차원 벡터이고, 2차원 벡터의 요소는 벡터이기 때문이다.
fill(matrix.begin(), matrix.end(), vector<int> (5,7));
* memset 사용
memset은 memory.h 헤더를 포함하여 사용한다.
memset(배열 이름, 초기화 값, 배열 크기);
보통 1바이트 단위로 메모리를 초기화하기 때문에 배열 값을 0으로 초기화할 때 주로 사용한다.
'IT > C, C++' 카테고리의 다른 글
[C++] 비트단위의 데이터 저장방법 (3) | 2022.10.06 |
---|---|
[C++] C++의 가상함수 동작 원리 (0) | 2022.09.16 |
[C/C++] Hash Table vs STL map (0) | 2022.09.15 |
Google C/C++ CodeStyle (0) | 2022.08.12 |
[C/C++] const 개념 한번에 이해하기 (0) | 2022.08.04 |
- Total
- Today
- Yesterday
- algorithm
- coding interview
- rust
- C++
- ProblemSolving
- 러스트 입문
- Problem Solving
- 트리
- Interview
- 내돈내산
- 알고리즘
- 속초 맛집
- PS
- Medium
- LeetCode
- 속초
- 솔직후기
- DP
- 인터뷰
- 자료구조
- 반드시 알아야 할 자료구조
- 러스트 기초
- 러스트
- 러스트 배우기
- 맛집
- 리트코드
- 기술면접
- 코딩인터뷰
- interview question
- Tree
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |