-
ch 01- 03 . const 들이대기1effective c++ & c++ 2022. 8. 29. 18:51
const와 포인터
const가 *표 왼쪽에 있으면 "포인터가 가리키는 대상"이 상수
= hello라는 내용을 변경할 수 없음.
char greeting[] = "hello"; const char * p = greeting; // char const * p = greeting; 도 동일한 의미
const가 *표 오른쪽에 있으면, "포인터 자체"가 상수
= p가 가리키는 주소를 변경할 수 없음.
char greeting[] = "hello"; char * const p = greeting;
container 컨테이너와 iterator 반복자
컨테이너(Container)
- 다른 객체들을 보관하는 하나의 커다란 보관소
- 클래스 템플릿 형태로 구현되어 있기 때문에 임의의 타입 원소들을 담을 수 있다.
- 자신이 보관하는 원소들의 메모리를 관리
- 각각의 원소에 접근할 수 있도록 멤버 함수를 제공.
- 원소에 접근하는 방법으로는
1. 직접 함수를 호출
2. 반복자를 활용한 접근
두 가지가 존재한다.
- STL에서 제공하는 컨테이너의 종류로는 동적 배열(vector), 큐(queue), 스택(stack), 힙(priortiy_queue), 링크드 리스트(list), 트리(set), 연관 컨테이너(map) 등이 있다.
map은 c#에서 dictionary와 유사한 기능을 하는 것 같다.반복자(Iterator)
- 컨테이너(임의 타입의 객체를 보관할 수 있음)에 저장되어 있는 모든 원소들을 전체적으로 훑어 나갈 때 사용되는 객체.
- 자신이 가리키는 대상이 아닌 것을 가리키는 경우는 허용하지 않음.
- 반복자가 가리키는 대상 자체는 변경 가능.
- 각 타입에 ::iterator를 붙여주어 사용.
vector<int> container; // 컨테이너 생성 vector<int>::iterator itr; //반복자 생성 itr = container.begin(); //반복자 초기화
- 컨테이너와 알고리즘(반복자들을 가지고 일련의 작업을 수행)을 하나로 동작하게하는 인터페이스 역할 수행.
- 해당 컨테이너의 반복자를 생성하는 방법은 동일하지만, 컨테이너마다 지원하는 반복자가 상이하다고 한다.
따라서 반복자마다 지원하는 연산도 달라진다.
https://jokerkwu.tistory.com/128
* container, iterator, algorithm에 대한 정의
C++ 반복자(Iterator)
C++ 표준 라이브러리를 보면 다양한 라이브러리들이 있다. 보통 세 개의 라이브러리들을 C++ 표준 라이브러리라고 일컫는다. 임의 타입의 객체를 보관할 수 있는 컨테이너 (Container) 컨테이너에 보
jokerkwu.tistory.com
https://ansohxxn.github.io/stl/chapter16-2/
* 반복자에 대한 전반적인 개념
[C++ 표준] STL 반복자(+ 반복자의 종류 Iterator Category
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀 🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
ansohxxn.github.io
https://cho001.tistory.com/193
* 반복자를 활용하여 원소를 순회하는 반복문을 간단히 하는 방법 참조
[C++] Iterator에 대해서
반복자 iterator의 개념 반복자는 포인터와 상당히 비슷하다. 컨테이너에 저장되어 있는 원소들을 참조할 때 사용한다. 포인터와 비슷한 객체이다. 반복자는 컨테이너에 저장된 원소를 순회하고
cho001.tistory.com
자주 사용해보고 컨테이너와 반복자의 개념을 흡수해야겠다.반복자를 활용하여 원소를 순회하는 방법에서 후위 연산자를 활용하면 반복자의 이전 값을 반환하기 때문에임시로 객체가 생겨 성능이 늦어진다는 이야기가 있는데.. c++ 단항 연산자 오버로딩 부분을 확인해보도록 하자.윤성우 c++ 프로그래밍 414 페이지 ~ 424 페이지를 참조.const 와 반복자
반복자를 const로 선언하는 것은 포인터를 상수로 선언하는 것과 같다.
변경이 불가능한 객체를 가리키는 반복자가 필요할 때 const_iterator을 사용한다.
vector<int> v; ... const vector<int>::iterator itr = v.begin(); // T* const처럼 동작 *iter = 10; // 가능 ++iter; // error
vector<int> v; ... vector<int>::const_iterator citr = v.begin(); //const T* 처럼 동작 *citer = 10; //error ++citer; // 가능
const와 함수 반환 값
- 함수 반환 값을 const로 지정해주면, 사용자 측의 에러 돌발 상황을 줄이는 효과를 볼 수 있다.
1. const 객체는 const로 선언된 함수만 호출할 수 있다는 점을 활용
#include <iostream> using namespace std; class Point { private: int xpos,ypos; public: Point(int x=0,int y=0) : xpos(x),ypos(y) {} const Point operator++(int) { const Point retobj(xpos,ypos); xpos+=1; ypos+=1; return retobj; } }; int main() { Point pos(3,5); (pos++)++; // error return 0; }
2. const 객체는 값을 변경할 수 없다는 점을 활용
class Rational{...}; const Rational operator*(const Rational& lhs, const Rational& rhs); int main() { Rational a,b,c; ... (a*b) = c; //error if(a*b = c) //error ... }
'effective c++ & c++' 카테고리의 다른 글
ch02-1. 생성자, 복사 생성자, 복사 대입 연산자, 소멸자 (2) 2022.09.21 ch01-4. 객체를 사용하기 전에 객체를 반드시 초기화하자. (0) 2022.09.06 ch01-03. const 들이대기 2 (0) 2022.08.31 ch01. 가급적 선행 처리자 보다 컴파일러를 활용하자. (0) 2022.08.25 ch.01 c++을 어떻게 바라보면 좋을까 (0) 2022.08.23