STL(Standard Template Library)은 C++ 내 템플릿 클래스들의 집합이며, 개발자에게 도움줄 수많은 자료구조와 함수들이 구현 되어있다.
기본 4가지로 구성 되어있다.
- 알고리즘 <algorithm> 헤더 파일 내 (정렬, 탐색
- 컨테이너 (선형,비선형 자료구조) 예) <vector>, <map>
- 함수
- 이터레이터 (반복자) 모든 컨테이너들은 이를 지원하지 않음.
STL은 기본적으로 범위 기반 for문을 돌려 원소에 접근할 수가 있다. 핵심은 4번에 있다, 이를 실행할 수 있는 조건이 바로 .begin() 함수다 즉 첫 원소의 주소를 이터레이터 형태로 반환하는 함수다.
예) for(auto item : 컨테이너 이름)
여기서 한 가지 의문점이 들 수도 있는데
const auto :
const auto& :
auto :
auto& :
위 4개로 받을 수가 있다, 하지만 const로 받는다해도 const_cast로 일반 포인터로 캐스팅 후 값 변경이 가능하지만 사전에 실수를 방지하고자 값을 변화시키지 않을거면 붙이는게 좋다.
파라미터냐 전역이냐의 가장 큰 차이점이 있다.
#include <iostream>
#include <vector>
using namespace std;
class Vector_test
{
public:
static vector<int> v;
};
vector<int> Vector_test::v;
void Print()
{
cout << "벡터 원소 출력" << endl;
for (auto item : Vector_test::v)
cout << item << endl;
}
void Test()
{
for (auto& item : Vector_test::v)
item += 1;
cout << "Test 함수 \n" << endl;
Print();
}
int main()
{
int n; cin >> n;
Vector_test::v.resize(n);
for (int i = 0; i < n; i++)
cin >> Vector_test::v[i];
Test();
Print();
}
근데 만약에 이를 매개변수로 넘긴다면 파라미터로 넘어온건 복사본이라 값의 변화가 없을 것이다. 따라서 &를 붙여 레퍼런스를 가져와서 바꿔야한다.
#include <iostream>
#include <vector>
using namespace std;
void Print(vector<int> v)
{
cout << "벡터 원소 출력" << endl;
for (auto item : v)
cout << item << endl;
}
void Test(vector<int> v)
{
for (auto& item : v)
item += 1;
cout << "Test 함수 \n" << endl;
Print(v);
}
int main()
{
vector<int> v;
int n; cin >> n;
v.resize(n);
for (int i = 0; i < n; i++)
cin >> v[i];
Test(v);
Print(v);
}
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ _if STL 알고리즘 함수 (파라미터 _Pr _Pred) > 조건자 (Predicate) (0) | 2022.06.21 |
---|---|
C++ 구조적 바인딩 (Structured Bindings) (0) | 2022.06.21 |
C++ 예외 처리용 throw(), noexcept() (0) | 2022.06.16 |
C++ 전방 선언 (Forward Declaration) (0) | 2022.06.16 |
C++ typename의 두 가지 의미 (0) | 2022.06.16 |