1. String Library
String은 가변길이 문자열.
String을 사용하려면 string 헤더를 include 시켜야 함.
직접 초기화와 복사 초기화
string s1; // 빈 문자열로 초기화
string s2 = s1; // 빈 문자열 s1을 복사해 초기화
string s3 = “Hi”; // “Hi” 문자열을 복사 초기화
string s4(10, ‘c’); // ‘c’의 10개 복사본으로 초기화
string s5(“Hi”); // s3과 같이 초기화되나 직접 초기화
string 연산
getline(is, str); // is에서 한 줄 읽어 s에 넣고 is 반환
str.empty(); // str이 비어있으면 true, 아니면 false 반환
str.size(); // str의 문자 수를 반환
비교 연산은 대소문자를 구별하며 사전 순으로 함.
str의 모든 char에 대해 연산하고 싶으면 다음과 같이 사용
for(auto &c : str) // 요소에 직접 접근해 변경할 때
for(auto c : str) // 출력 등을 할 때
2. Vector Library
Vector는 타입이 모두 같은 객체의 모음
Vector는 그 안에 다른 객체를 담기 때문에 흔히 컨테이너라고 함
Vector를 사용하려면 vector 헤더를 include 시켜야 함
Vector는 클래스 템플릿(Class template) – 템플릿 자체는 함수도 템플릿도 아님. 템플릿을 사용해 클래스나 함수를 만드는 과정을 인스턴스화(Instantiation)라고 함.
Vector에서 추가 정보는 담을 객체 타입.
vector<int> iv; // iv에 담을 객체는 int형
vector<vector<string>> page; // page에 담을 객체는 string을 가지는 vector
정의 및 초기화
vector<int> v1; // int형 vector 하나 정의
vector<string> page{“a”, “an”, “the”}; // 목록 직접 초기화
vector<string> page = {“a”, “an”, “the”}; // 목록 복사 초기화
vector<int> ivec(10, -1); // int 요소가 10개인 ivec에 각각 -1로 직접 초기화
vector<int> ivec2(10); // int 요소가 10개이며 각각 0으로 초기화됨
vector<int> ivec3{10}; // 값이 10인 요소 1개
Vector는 배열과 다르게 실행 중에 요소를 제한 없이 추가할 수 있음. Vector의 각 요소가 모두 같은 값이 아니라면 개수를 정해놓는 것이 오히려 성능에 나쁜 영향을 미침.
Vector 연산
v.empty()
v.size()
v.push_back(i);
String 연산과 마찬가지로 vec의 모든 요소에 대해 연산하고 싶으면 다음과 같이 사용
for ( auto &i : vec )
for( auto i : vec )
Size_type 타입
String과 Vector에서 size를 사용하면 반환되는 타입.
크기를 나타내는 부호 없는 타입. 정확히 알 필요는 없음.
3. Iterator
반복자(Iterator)를 사용하면 객체에 간접적으로 접근할 수 있음
포인터와는 다르게 반복자는 주소 연산자를 사용해 얻지 않음 – 이름이 begin과 end인 멤버를 통해
end에서 반환한 반복자는 연관된 컨테이너의 마지막 요소 바로 다음에 위치한 반복자임 – 흔히 off-the-end iterator(끝 지난 반복자) 혹은 end 반복자라고 말함
auto b = v.begin(), e = v.end();
Iterator 연산
++, -- : iterator가 가리키고 있는 컨테이너 요소의 전, 후를 지시하도록 할 수 있음
-> : iterator를 역참조해 대상 요소에서 멤버를 가져올 수 있음.
* : iterator가 나타내는 요소에 대한 참조자를 가져올 수 있음.
Iterator 타입
size_type과 비슷하게 정확하게 알 필요 없음. 하지만 반복자가 있는 라이브러리 타입에서는 실제 반복자 타입을 나타내는 iterator, const_iterator라는 타입 정의
const_iterator는 const 포인터처럼 행동함
역참조와 멤버 접근 결함
반복자를 역참조하면 그 반복자가 나타내는 객체를 얻음. 만약 객체가 클래스 타입이면 그 객체의 멤버에 접근할 수 있음.
*it.empty() // 오류. it는 iterator이기 때문에 empty 멤버 없음.
위와 같은 표현식을 간단히 하기 위해 ->연산자를 정의.
it->empty()
일부 vector 연산은 반복자를 무효화함. vector는 동적으로 커질 수 있기 때문에 크기가 변하면 해당 vector에 속한 모든 반복자가 무효화될 수 있음. 자세히는 추후에 설명
반복자 산술 연산
string과 vector에 대한 반복자에서는 한 번에 여러 요소를 이동하는 연산 가능
두 반복자의 빼기 연산은 오른쪽 반복자에 더해 왼쪽 반복자가 되는 수를 반환함. 그래서 중앙점에 가장 가까운 요소를 나타내는 iterator를 계산하는 식은 다음과 같음
auto mid = v.begin() + v.end() / 2
'Programming > Programming' 카테고리의 다른 글
[C++] 사용자 정의 Vector 클래스 디자인 (0) | 2018.12.23 |
---|---|
[C++] 함수 및 다중 정의 (Overload) (1) | 2018.01.21 |
[C++] Try 구역과 예외 처리 (0) | 2018.01.15 |
[C++] 변수와 기본 타입 (0) | 2018.01.11 |
[C - SDL] IWBTKM 소개 및 Source (0) | 2017.12.28 |