reference(참조), pointer(포인터)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int a = 1;
int &ref = a; //data type &(variable) = variable
// a의 메모리 주소를 &ref에 할당하겠다는 뜻이다.
// 이때 ref는 int형 변수, &ref는 int형 변수 ref의 주소를 나타낸다.
// 즉, '&'연산자(참조 연산자)는 해당 변수의 주소를 의미한다.(reference)
// a와 ref의 주소가 같으므로 당연히 a와 ref의 값 역시 1로 동일하다.
// 즉 &a == &ref이며, 따라서 a == ref이다.
ref += 2; // a와 ref의 주소가 동일하므로, ref 값이 2 증가하면 a 값도 2 증가한다.
cout << "a : " << a << "\n";
cout << "ref : " << ref << "\n";
cout << "&a : " << &a << "\n";
cout << "&ref : " << &ref << "\n";
cout << "\n";
int *ptr = &a; //data type *(메모리 주소를 의미하는 variable) = 메모리 주소
// a의 값을 *ptr에 할당하겠다는 뜻이다.
// 이때 *ptr은 값, ptr은 *ptr의 주소를 나타낸다.
// 즉, '*'연산자(pointer 연산자)는 해당 주소의 값을 의미한다.
// a와 *ptr의 값은 동일하다. 하지만 이 둘의 주소는 다르다.
// 즉 a == *ptr이지만, &a != ptr이다.
*ptr += 2; // a와 ptr의 주소는 다르므로, ptr 값이 2 증가해도 a 값이 2 증가하지는 않는다.
cout << "a : " << a << "\n";
cout << "*ptr : " << *ptr << "\n";
cout << "ptr : " << ptr << "\n";
}
포인터 연산
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int arr[5] = {0, 1, 2, 3, 4};
int *ptr = arr; // arr의 맨 앞 메모리 주소에 해당하는 값(arr[0] = 0)을 *ptr에 할당
cout << ptr << " " << *ptr << "\n";
ptr++; // 포인터 연산
// 배열, vector에서는 연속적인 메모리 공간을 갖기에 연산을 통해 다른 요소에 접근할 수 있다.
// 현재 위치는 arr[0]이고, ++연산을 통해 arr[1]로 이동했다.
// ptr += 1과 동일하다.
cout << ptr << " " << *ptr << "\n";
// ++, --, +, -를 통해 포인터 연산을 할 수 있다.
// 단, *, /은 사용할 수 없다.
}
iterator(반복자)
자료구조의 요소들을 순회하며 각 요소들을 가리킬 수 있는 것.
pointer를 통한 순회는 연속적인 메모리 주소를 가지는 vector, 배열 등에 한정되지만, iterator를 이용한 순회는 연속적인 메모리 주소를 가지고 있지 않은 deque에도 적용 가능하다.
iterator는 버스 정류장를 순회하는 버스와도 같다. 각 버스 정류장 사이의 거리는 다르더라도 버스가 지나치는 정류장 순서대로 1번 정류장, 2번 정류장, 3번 정류장, 4번 정류장 ... 으로 번호를 매기지, 3번 버스 정류장과 다음 정류장 간의 거리가 엄청 멀다고 해서 3번 정류장 다음의 정류장 번호를 1000번으로 매기지는 않는다.
반면에 pointer로 자료구조의 요소를 순회하는 경우, pointer는 메모리 주소를 기준으로 순회하므로 3번 버스 정류장과 다음 정류장 간의 거리가 엄청 멀면 3번 정류장 다음의 정류장 번호를 1000번으로 매길 수 있다. 거리가 멀면 주소도 그만큼 멀기 때문이다. 따라서 pointer를 이용한 순회가 deque에서는 불가능하다.
pointer로 자료구조의 요소를 순회할 수 있다고 했다. 즉, pointer 역시 iterator의 일종인 셈이다.
참고로, deque와 vector의 iterator는 random access iterator로 iterator의 종류가 같다.
deque와 vector에서의 iterator는, *연산으로 해당 iterator가 가리키는 값을 알 수 있으며, ++, -- 등의 연산자로 다른 요소로 이동할 수 있다.
iterator의 종류는 이외에도 여러 가지가 있다. 나머지는 아래 reference을 참고하자.
https://cplusplus.com/reference/iterator/
https://cplusplus.com/reference/iterator/
Supports inequality comparisons (<, >, <= and >=) between iteratorsa < b a > b a <= b a >= b
cplusplus.com
정렬(sort) (0) | 2023.04.03 |
---|---|
자료구조 - set, map (0) | 2023.04.02 |
자료구조 - vector (0) | 2023.03.30 |
자료구조 - deque (0) | 2023.03.30 |
자료구조 - stack, queue, priority_queue (0) | 2023.03.30 |
댓글 영역