웹사이트 검색

C++의 2D 벡터 - 실용 가이드 2D 벡터


벡터의 벡터라고도 하는 C++의 2D 벡터는 행렬, 테이블 또는 기타 구조를 동적으로 생성하는 기반을 형성합니다. C++에서 2D 벡터 주제에 도달하기 전에 C++에서 1차원 벡터 사용 자습서를 살펴보는 것이 좋습니다.

벡터 헤더 파일 포함

프로그램 시작 부분에 포함된 헤더 파일이 아니라면 C++에서 벡터를 사용하는 것은 불가능합니다. 2D 벡터를 사용하기 위해 다음을 포함합니다.

#include<vector>

수많은 종류의 표준 템플릿 라이브러리(STL)를 하나씩 포함하는 대신 다음과 같이 모두 포함할 수 있습니다.

#include<bits/stdc++.h>

C++에서 2D 벡터 초기화

먼저 2차원 벡터를 초기화하는 특정 방법을 배웁니다. 다음 코드 스니펫은 모든 요소가 이미 알려진 경우 2D 벡터의 초기화를 설명합니다.

#include<iostream>
#include<vector>
using namespace std;

int main(){
	vector<vector<int>> v {{1, 0, 1}, {0, 1}, {1, 0, 1}}; 
	for(int i=0;i<v.size();i++){
		for(int j=0;j<v[i].size();j++)
			cout<<v[i][j]<<" ";
		cout<<endl;
	}					   
}

위의 코드를 실행한 후 다음과 같은 결과를 얻습니다.

1 0 1 
0 1 
1 0 1 

vector>의 사용은 우리가 벡터의 벡터에 대해 작업하고 있음을 상징합니다. {1, 0, 1}{0, 1}와 같이 중괄호의 첫 번째 세트 내부에 있는 각 값은 독립적으로 벡터입니다.

참고: 다른 데이터 유형의 C++에서 2D 벡터를 생성하려면 데이터 유형을 <char>와 같이 가장 안쪽 꺽쇠 괄호 안에 배치할 수 있습니다.

우리는 2차원 데이터 구조에 대해 작업하고 있으므로 전체 데이터 구조를 효율적으로 순회하려면 두 개의 루프가 필요합니다. 외부 루프는 행을 따라 이동하는 반면 내부 루프는 열을 가로지릅니다.

참고: size() 함수는 각 개별 벡터 내부의 총 요소 수가 아니라 2D 벡터 내부의 벡터 수를 제공합니다.

2D 벡터 초기화를 위한 크기 지정

2D 벡터는 크기가 클 수 있습니다. 우리는 프로그래머가 모든 단일 값을 제공할 것이라고 기대할 수 없습니다. 따라서 행과 열의 수를 기준으로 2차원 벡터를 초기화할 수 있습니다.

#include<iostream>
#include<vector>
using namespace std;

int main(){
	//Number of columns
	int num_col = 3;

	// Number of rows
	int num_row = 4;

	// Initializing a single row
	vector<int> row(num_col, 0);

	// Initializing the 2-D vector
	vector<vector<int>> v(num_row, row) ;

	for(int i=0;i<v.size();i++){
		for(int j=0;j<v[i].size();j++)
			cout<<v[i][j]<<" ";
		cout<<endl;
	}					   
}

출력은 다음과 같습니다.

0 0 0 
0 0 0 
0 0 0 
0 0 0 

벡터의 표준 초기화인vector v(10, 0)에 따르면 첫 번째 인수는 벡터의 크기를 나타내고 두 번째 인수는 모든 셀이 보유하는 기본값을 나타냅니다.

위의 코드 스니펫에서는 표준 초기화의 두 단계를 따릅니다.

  • vector row(num_col, 0) - 이 명령문에서 row라는 1차원 벡터를 생성합니다. 이 벡터의 길이는 로 정의됩니다. num_col이고 기본값은 0입니다. 기본적으로 2차원 벡터의 각 행을 형성합니다.
  • vector> v(num_row, row) - 이 명령문에서 2차원 벡터의 모든 값을 row는 마지막 문에서 생성되었습니다.

위의 절차를 이해한 후 다음과 같이 C++에서 2D 벡터의 초기화를 개선할 수 있습니다.

#include<iostream>
#include<vector>
using namespace std;

int main(){
	//Number of columns
	int num_col = 3;

	// Number of rows
	int num_row = 4;

	// Initializing the 2-D vector
	vector<vector<int>> v(num_row, vector<int> (num_col, 0)) ;

	for(int i=0;i<v.size();i++){
		for(int j=0;j<v[i].size();j++)
			cout<<v[i][j]<<" ";
		cout<<endl;
	}					   
}

위의 코드는 이전과 유사한 출력을 제공할 것입니다. 왜냐하면 우리는 정확히 같은 일을 하지만 한 줄의 코드로 수행하기 때문입니다.

올바르게 기억한다면 표준 초기화는 위와 비슷합니다. 2차원 벡터를 만들려면 모든 요소의 기본값을 1차원 벡터로 설정해야 합니다.

마지막 방법은 행이나 열에 대한 지식 없이 2차원 벡터를 생성하는 것입니다. 다음과 같이 수행됩니다.

vector<vector<int>> v;

위의 선언은 요소를 벡터 형태로 저장할 수 있는 빈 컨테이너를 만듭니다.

2D 벡터의 반복자

인덱스를 사용하여 2D 벡터를 탐색하는 대신 C++에는 모든 특정 STL 데이터 구조에 대한 반복자가 제공됩니다.

#include<iostream>
#include<vector>
using namespace std;

int main(){

	vector<vector<int>> v {{1, 0, 1}, {0, 1}, {1, 0, 1}}; 

	// Iterator for the 2-D vector
	vector<vector<int>>::iterator it1;

	// Iterator for each vector inside the 2-D vector
	vector<int>::iterator it2;

	// Traversing a 2-D vector using iterators
	for(it1 = v.begin();it1 != v.end();it1++){
		for(it2 = it1->begin();it2 != it1->end();it2++)
			cout<<*it2<<" ";
		cout<<endl;
	}					   
}

산출:

1 0 1 
0 1 
1 0 1 

반복자는 위치 지정을 위한 인수가 필요한 특정 작업을 사용할 때 유용합니다. 반복자 값을 반환하는 가장 많이 사용되는 두 가지 함수는 다음과 같습니다.

  • v.begin() - 2D 벡터의 첫 번째 벡터에 대한 반복자를 반환합니다.
  • v.end() - 2D 벡터의 끝으로 반복자를 반환합니다.

2차원 벡터에서 가능한 몇 가지 작업을 살펴보겠습니다.

2차원 벡터에 요소 추가

2차원 벡터의 끝에 요소를 추가하기 위해 push_back() 함수를 사용합니다.

#include<iostream>
#include<vector>
using namespace std;

int main(){

	// Initializing the 2-D vector
	vector<vector<int>> v;

	v.push_back({1, 0, 1});
	v.push_back({0, 1});
	v.push_back({1, 0, 1});

	for(int i=0;i<v.size();i++){
		for(int j=0;j<v[i].size();j++)
			cout<<v[i][j]<<" ";
		cout<<endl;
	}					   
}

산출:

1 0 1 
0 1 
1 0 1 

우리의 컨테이너는 벡터의 벡터이기 때문에 내부에 완전한 벡터를 넣는 것이 의미가 있습니다. 따라서 push_back() 함수 내부에 전달되는 인수는 벡터여야 합니다.

참고: v[i]는 1차원 벡터를 나타냅니다. 따라서 프로그래머가 2차원 벡터 내부의 특정 벡터에 요소를 추가해야 하는 경우 v[i].push_back(value)를 사용할 수 있습니다.

특정 위치에 완전한 벡터를 추가하려면 insert() 함수를 사용합니다.

#include<iostream>
#include<vector>
using namespace std;

int main(){

	// Initializing the 2-D vector
	vector<vector<int>> v;

	v.push_back({1, 0, 1});
	v.push_back({0, 1});
	v.push_back({1, 0, 1});

	// Iterator for the 2-D vector
	vector<vector<int>>::iterator it = v.begin();

	// Inserting the vector = {1, 2, 3} as the second vector
	v.insert(it + 1, {1, 2, 3});
				  
	for(int i=0;i<v.size();i++){
		for(int j=0;j<v[i].size();j++)
			cout<<v[i][j]<<" ";
		cout<<endl;
	}				   
}

산출:

1 0 1 
1 2 3 
0 1 
1 0 1 

insert() 함수에는 정수 인덱스가 아닌 반복자로서 위치 인수가 필요합니다. 그 다음에는 지정된 위치에 삽입되어야 하는 벡터가 옵니다.

C++의 2D 벡터에서 요소 제거

push_back()과 반대로 C++는 주어진 벡터에서 마지막 요소를 제거하는 임무를 가진 pop_back() 함수를 제공합니다.

이 기사의 맥락에서 pop_back() 함수는 2D 벡터에서 마지막 벡터를 제거하는 역할을 합니다.

#include<iostream>
#include<vector>
using namespace std;

int main(){

	// Initializing the 2-D vector
	vector<vector<int>> v ;

	// Adding vectors to the empty 2-D vector
	v.push_back({1, 0, 1});
	v.push_back({0, 1});
	v.push_back({1, 0, 1});

	// Remove the last vector from a 2-D vector
	v.pop_back();
				  
	for(int i=0;i<v.size();i++){
		for(int j=0;j<v[i].size();j++)
			cout<<v[i][j]<<" ";
		cout<<endl;
	}				   
}

산출:

1 0 1 
0 1 

pop_back() 함수 외에도 지정된 인덱스에서 요소를 제거할 수 있는 erase() 함수가 있습니다.

#include<iostream>
#include<vector>
using namespace std;

int main(){

	// Initializing the 2-D vector
	vector<vector<int>> v ;

	// Pushing vector inside the empty 2-D vector
	v.push_back({1, 0, 1});
	v.push_back({0, 1});
	v.push_back({1, 0, 1});

	// Iterator for the 2-D vector
	vector<vector<int>>::iterator it = v.begin();

	// Remove the second vector from a 2-D vector
	v.erase(it + 1);
				  
	for(int i=0;i<v.size();i++){
		for(int j=0;j<v[i].size();j++)
			cout<<v[i][j]<<" ";
		cout<<endl;
	}				   
}

산출:

1 0 1 
1 0 1 

insert() 함수와 유사하게 반복자로 위치 인수가 필요합니다. 2차원 벡터에서 모든 벡터를 제거하려면 clear() 함수를 사용할 수 있습니다.

위의 함수는 C++에서 2차원 벡터를 사용하는 동안 익숙해지기에 충분할 수 있습니다.

결론

프로그래머가 관련된 구문을 알고 있다면 C++의 2차원 벡터는 사용하기가 매우 쉽습니다. 이러한 종류의 벡터는 행렬, 그래프 및 기타 2차원 개체와 관련된 문제를 해결할 때 유용합니다.

이 튜토리얼이 2D 벡터 사용에 대한 독자의 이해를 돕기를 바랍니다. 주제와 관련된 질문은 아래에 자유롭게 댓글을 달아주세요.