2024.12.11 (강의는 12.09). 나는 말하는 감자임이 틀림 없다.
1. pair
: 두개의 값을 하나의 쌍으로 관리해주는 하나의 data type
: 두개의 member 변수를 가지고 있는 하나의 class
= member변수의 type는 template로 이루어져 있기 때문에 내가 선언해서 정해줄 수 있음.
#include<utility.h> // container사용 시 생략 가능
pair <T, U> p // T : p.first, U : p.second로 인자 접근
pair<int, double>p = {2, 3.1}; // p.first = 2, p.second = 3.1
operator (==, !=, <, >, <=, >=) 정의되어 있음.
== : first, second가 둘 다 같다
< : 1순위. first가 작다. 2순위. second가 작다 (first가 같을 경우 2순위로 넘어간다)
2. reference - 참조자
: 변수를 선언할때 사용. 자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름
: 참조형은 참조하는 값과 동일하게 작동한다. 이런 의미에서 참조형은 참조되는 객체의 별칭으로 사용된다.
: 생성시 초기화가 필요함 : 선언할 때 초기화 되어야함.
reference 참조, 8 byte copy, 원본 변경 가능 (** 원본을 바꾸고 싶을 때 많이 사용함)
데이터 형태 & 참조자 //<= 이렇게 사용함.
int a; // 새로운 공간에 변수 값을 가지고 옴.
int&c = a; //새로운 공간에 reference를 가지고 옴.(=공간사용) a의 변수값과 같은 주소와 값을 공유함.
예를 들어보자)_
|
int a = 3;
|
|
a
|
|
|
|
|
|
3
|
|
|
|
|
|
|
|||||
|
int &b = a;
int c = a;
|
|
a b
|
|
c
|
|
|
|
3
|
|
3
|
|
|
|
|
|||||
|
b = 4;
c = 6;
|
|
a b
|
|
c
|
|
|
|
4
|
|
6
|
|
|
=> b는 a의 값을 참조 (a와 방, 변수를 공유)하므로 b의 값이 변하면 a도 b 값으로 변한다.
3. auto
: 초기값 type에 맞춰 선언하는 변수의 type이 자동으로 결정됨. (내가 명시하지 않아도 알아서 결정)
: compile time에 자동으로 type 완성 (선언과 동시에 초기화 필요)
함수의 return type 지원
함수의 매개변수에는 지원X (14기준) => 필요시 template사용해야함.
iterator 등 type이 복잡해지는 경우에 (type이 길어지는 경우) 특히 유용하게 사용한다.
auto a = 1; // = int
auto &b = a; // = int
4. template
: 여러 자료형을 하나의 함수, 클래스로 사용할 수 있게 만들어놓은 틀
: 동일한 기능을 하는 함수나 클래스를 하나로 묶어주는 것
: 타입이 달라지면 어러개로 선언해야하는데 그걸 안해도 되게 해줌.
형식매개변수 : typename == class keyword (완전히 동일한 기능)
STL의 T도 이거!
template<typenameT, typenameU, typenameV> class template{}; //이렇게 형식매개변수 여러개 사용가능!
// Fumction Template
template<typename T>
T sum(T a, T b) {return a+b; }
// 이렇게 해두면 sum(1, 2);, sum(1.3, 2.8);, sum('a', 'b');전부 이용 가능함
// 변수를 T type으로 정의해둠으로써 모든 type의 변수를 사용할 수 있음.
// 함수를 호출할 때는 원하는 type에 맞춰서 호출하면 됨. 아니면 auto 써서 입력한 변수 형태를 자동 인식해 출력하게 하거나?+
// Class template
template<class T>
struct Data {T a, b; };
// 이렇게 만들어두면 Data<int> A;, Data<double> A;, Data<char> A; 로 사용할 수 있음.
// 클래스는 만들어줄 때 data type을 명시해야함.
// 함수는 입력된 변수의 데이터 타입을 자동으로 인지하기는 하는데 입력해줘도 됨.
5. range based for loop
for(①:②) {...} // : 범위 기반 루프 //for (초기화 : 조건 : 증감)
②의 시작부터 끝까지 각 원소를 ①에 담으면서 루프 수행.
① : 배열, 컨테이넝의 각 원소를 담을 변수 선언
② : 구간을 반복할 배열, 컨테이너 이름.
|
int arr [5] = {1, 2, 3, 4, 5} <= 이런 배열이 있다고 할 때
|
||
|
코드
|
for (auto x: arr) {x++}
|
for (auto& x: arr) {x++}
|
|
copy
|
value
|
reference
|
|
객체 크기 만큼 복사
|
8 byte
|
|
|
원본 변경
|
불가
|
가능
|
|
수행 후
arr |
1, 2, 3, 4, 5
|
2, 3, 4, 5, 6
|
|
배열의 1번 변수 복사 -> ++
-> 복사된 값이 아니라 순서에 ++
-> 다음 값으로 넘어가서 복사 이런 느낌
; 단순히 배열 내의 변수를 순차적으로 복사해서 담은 배열 생김.
|
배열의 1번 변수의 reference복사 -> ++
-> 복사된 값에 ++이 적용
-> 다음 값으로 넘어가서 복사 이런 느낌
; 기존 배열에서 모든 값들이 ++된 값을 담은 배열 생김.
|
|
= 배열에서는 range-based for loop를 쓰기 애매한 경우가 많기 때문에 잘 쓰지 않음. 루프문은 컨테이너에서 많이 씀.
6. initializer list (초기화자 리스트)
: braced-init-list {...} 로 원소들을 담은 type
braced-init-list가 초기화 또는 대입에 사용되는 경우, auto에 바인딩되는 경우 자동 생성.
Narrow-conversion(암시적 타입 변환, 데이터 손실이 있는 변환) 불가
모든 class의 기본 생성자 및 대입연산의 인자로 initalizer_list type이 제공되므로 STL container를 포함한 모든 객체를 { }를 활용해 생성 및 대입 가능.
initializae_list<int> i1{1,2,3,4,5};
for (auto x : I1) cou << x << ' ';
set <int> s {1,2,3,4,5}; // 1,2,3,4,5
s = {5,6}; //5,6
vector<pair <int,int>> v{{1,2}, {3,1}, {2,5}};
7. class vs struct
: 특정 객체를 생성하기 위해 멤버 변수와 멤버 함수를 정의하는 일정의 틀.
: C++에서는 접근지시자 default값을 제외하고는 완전히 동일함.
= class : private, struct : public
uniform intialization (유티폼 초기화, 모든 타입의 변수에 사용 가능) 적극활용
-> "preventing narrowing conversion"기능
= 어떤 변수에 해당 변수가 저장할 수 있는 크기보다 더 큰 크기의 데이터를 저장하여
일부 데이터의 손실이 발생하는 것을 방지하는 것
int var { 0 }; // 1) direct brace initialization (권장)
int var = { 0 }; // 2) copy brace initialization
int var { }; // 3) value initialization = 인자 없는 생성자를 호출하며 객체를 생성
struct Data {
int x,y;
void print() {
printf("%d %dn",x,y;
}
int sum() {
return x+y;
}
int mul(){
return x*y;
}
};
Data A = {}; // x=0, y=0 (빈 공간일 경우 기본적으로 변수가 0으로 초기화됨.)
Data B = {1}; // x=1, y=0
Data C = {2,3}; // x=2, y=3
8. mem function
#include <string.h> // 정적메모리할당
loop와 동일하나 loop보다 빠름
void* menset(void*dest,int ch, std::size_t count);
// = dest의 count개의 byte값을 ch로 변경한다 (보통 0초기화시에 많이 사용함)
memset(arr,0,sizeof(arr)) // arr의 arr의 길이만큼의 byte값을 0으로 변경한다
.
이거의 경우 container, vector쓰면 문제가 생길 수 있음.
얘네가 가지고 있는 iterator에 단순 값 외의 다른 정보들도 포함되어있어서 이걸 0으로 초기화하면 문제가 생김.
때문에 이렇게 0으로 초기화하는 것은 array에서만 사용해야함.
int memcmp(const void* lhs, const void* rhs, std::size_t count);
// = lhs와 rhs의 count byte 크기의 값이 같은지 비교
memcmp(arr,arr2,sizeof(arr))
void-memcpy(void*dest, const void* src, std::size_t count);
// dest의 count byte크기를 src로 복사 (memmove와 비슷함)
memcpy (arr,arrw,sizeof(arr))
'C++ > STL' 카테고리의 다른 글
| [STL] Vector (0) | 2025.06.12 |
|---|---|
| [STL] STL Algorithm - sort, nth_element, find, find_if (0) | 2025.06.12 |
| [STL] STL Iterator (0) | 2025.06.12 |
| [STL] Modern C++ (2) - operator overloading, function object (1) | 2025.06.12 |
| [STL] STL이란 (0) | 2025.06.12 |