STL
ㄴ개거체들을 저장하는 객체나 클래스
vector(배열)(<-지금 이거), list(링크드 리스트), deque(덱), string(문자열 전용 컨테이너), map , stack(스택) 등
2. literator(반복자)
ㄴ컨테이너에 저장된 요소를 순회하고 접근하는 객체나 클래스
ㄴ데이터를 다루기 위한 함수
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 |