본문 바로가기
c++

[c++] STL - 컨테이너 - vector

by yoonjunho 2023. 2. 20.

STL

1. container(컨테이너)

ㄴ개거체들을 저장하는 객체나 클래스

vector(배열)(<-지금 이거),  list(링크드 리스트),   deque(덱),   string(문자열 전용 컨테이너), map , stack(스택)

 

2. literator(반복자)

ㄴ컨테이너에 저장된 요소를 순회하고 접근하는 객체나 클래스

 

3. 알고리즘(algorithm)

ㄴ데이터를 다루기 위한 함수

find, sort, search 등

 

4. 함수 객체(function object), 함수자(functor)

ㄴ함수처럼 동작하는 객체로, operator() 연산자를 중첩한 클래스의 객체

 

 

vector

( 벡터 )

#include <iostream>
#include <vector>

using namespace std;
int main() {
	vector <int> x;
	x.push_back(1);
	x.push_back(2);
	for (int i = 0; i < x.size(); i++)
		cout << x[i] << endl;
	return 0;
}

ㄴ #include <vector>를 해야한다.

    vector <int> x; 

ㄴ int x[ ]와 같은데, 크기는 결정이 되어있지 않다. vector는 push_back을 하면 자동으로 늘어난다.

 

여러가지 벡터 생성 방법

#include <iostream>
#include <vector>	//vector 사용
using namespace std;

int main()
{
	//비어있는 vector 생성
	vector <int> a;

	//0으로 초기화된 vector 3개 생성
	vector <int> b(3);

	//10으로 초기화된 vector 3개 생성
	vector <int> c(3, 10);

	//vector c를 복사하여 d생성
	vector <int> d(c);
    
	//0, 1, 2로 초기화된 vector e생성, C++11 부터 지원
	vector <int> e = { 0, 1, 2 };

	return 0;
}

vector는 메모리할당하여 사용한다.  메모리 동적 할당은 delete로 메모리를 해제하여 메모리 누수(leak)를 예방해야 하지만, vector는 블록 밖으로 나가거나 return을 만나면 자동으로 delete 되어 메모리를 해제해준다.

 

vector는 배열처럼 개별 요소에 접근할 때는 a [i]처럼 사용할 수 있다. 단, 원소를 생성하면서 write는 불가능하다. 즉, 이미 존재하는 값에서만 write가 가능하다. <- 그러니까, 이미 int 2칸이 할당 된 상태에서는 a[1]=20; 이런식으로 되는데,

새로운 원소를 추가할 때는 그러면 안되고, push_back() 메소드를 사용해야한다.

        //0으로 초기화된 vcetor 2개 생성
	vector <int> a(2);

	a[1] = 1;	//1번요소 1로 변경;
	//a[2] = 2;	//2번요소는 없으므로 에러
	a.push_back(2);	//2번요소 값을 생성하고 2로 초기화
        a[2] = 100;	//2번요소가 생겻으므로 write가능

 

 

1. 2차원 행렬 typedef 

typedef vector<vector<int>> matrix_t;
int main(void){

	matrix_t A(k, vector<int>(k));
	
    return 0;
}

 

 

 

벡터의 여러가지 메소드

 

 

 

 

vector라는 클래스인 x라는 객체이고, push_back(), size()...는 클래스의 멤버 함수이다.

 

x.push_back() 은 넣어주는 거(메모리 할당과 동시에 값 넣기)

 

v.erase(v.begin() + i); - 주솟값기반하여 요소 삭제(v.begin()은 첫 번째 요소의 주솟값, v.begin()+i는 i번째 요소의 주솟값

 

x.size()-벡터의 요소의 개수를 반환한다.

 

vector::clear => v.clear(); 벡터에서 모든 요소를 제거하는 함수이다. #include <vector>에 정의되어 있다.

백터 객체 최대 최소 관련 : (헤더파일 #include <algorithm>) 에 정의되어 있다.

 

<벡터의 최댓값과 최솟값 관련>-#include <algorithm>에 들어있다.

*max_element(벡터객체이름.begin(), 벡터객체이름.end());  는 벡터의 요소의 최댓값을 토해낸다. 

max_element(  백터객체이름.begin(),   백터객체이름.end()  )  -  백터객체이름.begin() ;  으로 백터의 요소의 최댓값의 인덱스를 알아낸다.

*min_element(백터객체이름.begin(), 백터객체이름.end());  는 백터의 요소의 최솟값을 토해낸다.  

min_elment(백터객체이름.begin(), 백터객체이름.end())  -  백터객체이름.begin();  으로 백터의 요소의 최솟값의 인덱스를 알아낸다. ㄴ 뒤에 ' -벡터객체이름.begin '을 하지 않고 그냥 min_element, max_element를 쓸 수 없다. 그렇게하면 오류가 발생한다. 

 

<벡터의 처음과 끝>

front() - 벡터의 첫 번째 요소를 반환한다.

back() - 벡터의 마지막 요소를 반환한다.

begin() - 벡터의 첫 번째 요소를 가리킨다.(즉, 주솟값을 반환한다.)

end() - 벡터의 마지막 요소를 가리킨다.(즉, 주솟값을 반환한다.) //stable_sort(sv.begin(), sv.end(), cmp);이런식으로 활용 가능

 

swap(vector객체) - 두 벡터의 내용을 교환(교체)한다.

empty() - 벡터가 비었는지 여부를 반환한다.

 

각 방의 요소에 접근하려면 x[i]이렇게 배열처럼 접근하면 된다.

at(index) - index번째 요소에 접근한다.

 

std::stable_sort() : stable_sort(sv.begin(), sv.end(), cmp); // 벡터를 정렬한다(내부적으로 merge sort로 구현되어 있다.). 람다처럼 어떻게 정렬할지도 cmp함수를 수정하여서 변경할 수 있다.-원리는 아직 모르고, #include <algorithm>에 있음. 

 

(vector내에 해당 원소가 존재하는지 확인)

find(v.begin(), v.end(), 찾을 대상) => 없으면, .end()를 반환한다.

if (find(natural_numbers.begin(), natural_numbers.end(), 1)!=natural_numbers.end())//벡터 내에 1이 있음 

이런식으로 사용한다. 

(vector내에서 해당 원소가 위치하는 인덱스 찾기)

find(v.begin(), v.end(), 찾을 대상) - v.begin()

 

 

 

 

 

https://swblossom.tistory.com/26

 

[C++] 벡터(vector)와 메소드들(push_back, front, back, begin, end)

표준 템플릿 라이브러리(STL : Standard Template Library) 안에 컨테이너(container), 이터레이터(iterator), 알고리즘(algorithm)템플릿 등을 제공한다. 컨테이너는 배열과 같이 여러 개의 값을 저장할 수 있는

swblossom.tistory.com

 

 

 

'c++' 카테고리의 다른 글

[c++] STL  (0) 2023.02.20
[c++]-STL-컨테이너-string  (0) 2023.02.20
[C++] 내림 함수(floor), 올림 함수(ceil)  (0) 2023.02.20
[c++] c++루트 구하기 sqrt함수  (0) 2023.02.20
[c++] 동적 배열의 크기를 구할 수 있을까?  (0) 2023.02.18