vector 컨테이너
[C++ 표준 템플릿 라이브러리, STL]
- STL(Standard Template Library)
: 표준 템플릿 라이브러리로 C++ 표준 라이브러리 중 하나이다. 많은 제네릭 클래스와 제네릭 함수를 포함하여 개발자는 이것들을 이용하여 쉽게 프로그램을 작성할 수 있다.
- STL의 구성
- 컨테이너 : 템플릿 클래스
- 데이터를 담아주는 자료구조를 표현한 클래스로 리스트, 큐, 스택, 맵, 셋, 벡터 등이 있음
- iterator : 컨테이너 원소에 대한 포인터
- 컨테이너의 원소들을 순회하면서 접근하기 위해 만들어진 컨테이너 원소에 대한 포인터
- 알고리즘 : 템플릿 함수
- 컨테이너 원소에 대한 복사, 검색, 삭제, 정렬 등의 기능을 구현한 템플릿 함수이지만, 컨테이너의 멤버 함수는 아님
[STL과 관련된 헤더 파일과 이름 공간]
- 헤더 파일 : 컨테이너 클래스를 이용하기 위한 헤더 파일 》 해당 클래스가 선언된 헤더 파일 include
#include <vector> // vector 클래스 사용하기 위해 헤더파일 include
#include <list> // list 클래스 사용하기 위해 헤더파일 include
#include <algorithm> // 알고리즘 함수에 상관없이 헤더파일 include
- 이름 공간 : STL이 선언된 이름 공간은 std
{예제 10-10 문자열을 저장하는 벡터 만들기 연습}
#include <iostream>
#include <string>
#include <vector>
using namesapce std;
int main() {
vector<string> sv; // 문자열 벡터 생성
string name;
cout << "이름을 5개 입력하라" << endl;
// 한 줄에 한 개씩 5개의 이름을 입력받기
for(int i=0; i<5; i++) {
cout << i+1 << ">>";
sv.push_back(name);
}
name = sv.at(a); // 벡터의 첫 원소
for(int i=1; i<sv.size(); i++) {
if(name < sv[i]) // sv[i]의 문자열이 name 보다 사전에서 뒤에 나옴
name = sv[i]; // name을 sv[i]의 문자열로 변경
}
cout << "사전에서 가장 뒤에 나오는 이름은 " << name << endl;
}
[iterator 사용]
- iterator란? : 반복자라고도 부르며 컨테이너의 원소를 가리키는 포인터
- iterator 변수 선언 : 구체적인 컨테이너를 저장하여 반복자 변수 선언
{예제 10-11 iterator를 사용하여 vector의 모든 원소에 2 곱하기}
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v; // 정수 벡터 생성
v.push_back(1);
v.push_back(2);
v.push_back(3);
vector<int>::iterator it; // 벡터 v의 원소에 대한 포인터 it 선언
for(it=v.begin(); it != v.end(); it++) { // iterator를 이용하여 모든 원소 탐색
int n = *it; // it가 가리키는 원소 값 리턴
n = n*2; // 곱하기 2
*it = n; // it가 가리키는 원소에 값 쓰기
}
for(it=v.begin(); it != v.end(); it++) // 벡터 v의 모든 원소 출력
cout << *it << ' ';
cout << endl;
}
map 컨테이너
[map 컨테이너]
- (키, 값)의 쌍을 원소로 저장하는 제네릭 컨테이너 》 동일한 '키'를 가진 원소가 중복 저장되면 오류 발생
- '키'로 '값' 검색
- #include <map> 필요
{예제 10-12 map으로 영한 사전 만들기}
#include <iostream>
#include <string>
#incldue <map>
using namespace std;
int main() {
map<string, string> dic; // 맵 컨테이너 생성. 키는 영어단어, 값은 한글단어
// 단어 3개를 map에 저장
dic.insert(make_pair("love", "사랑"));
dic.insert(make_pair("apple", "사과"));
dic["cherry"] = "체리";
cout << "저장된 단어 개수" << dic.size() << endl;
string eng;
while (true) {
cout << "찾고 싶은 단어 >> ";
getline(cin, eng); // 사용자로부터 키 입력
if (eng == "exit")
break; // "exit" 입력되면 종료
if(dic.find(eng) == dic.end()) // eng '키'를 끝까지 찾았는데 없음
cout << "없음" << endl;
else
cout << dic[eng] << endl; // dic에서 eng의 값을 찾아 출력
}
cout << "종료합니다" << endl;
}
[STL 알고리즘 사용하기]
- 알고리즘 함수
- 템플릿함수
- 전역함수 : STL 컨테이너 클래스의 멤버 함수가 아님
- iterator와 함께 작동
- sort() 함수 사례_두 개의 매개 변수 사용
- 첫번째 매개 변수 : 소팅을 시작한 원소의 주소
- 두번째 매개 변수 : 소팅 범위의 마지막 원소 다음 주소
#include <algorithm> // 헤더파일
vector<int> v;
...
sort(v.begin(), v.end()); // 벡터 전체 정렬
sort(v.begin(), v.end()+3); // v.begin()에서 v.begin()+2까지, 처음 3개 원소 정렬
sort(v.begin()+2, v.end()+5); // 벡터의 3번째 원소에서 v.begin()+4까지, 3개 원소 정렬
{예제 10-13 sort() 함수를 이용한 vector 정렬}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> v; // 정수 벡터 생성
cout << "5개의 정수를 입력하세요>> ";
for(int i=0; i<5; i++) {
int n;
cin >> n;
v.push_back(n); // 키보드에서 읽은 정수를 벡터에 삽입
}
// v.begin()에서 v.end() 사이의 값을 오름차순으로 정렬
// sort() 함수의 실행 결과 벡터 v의 원소 순서가 변경됨
sort(v.begin(), v.end());
// sort(v.begin(), v.begin()+3);
// sort(v.begin()+2, v.begin()+5);
vector<int>::iterator it; // 벡터 내의 원소를 탐색하는 iterator 변수 선언
for(it=v.begin(); it != v.end(); it++) // 벡터 v의 모든 원소 출력
cout << *it <<' ';
cout << endl;
}
[auto를 이용하여 쉬운 변수 선언] _ C++에서 auto
1. 기능
- C++11부터 auto 선언의 의미 수정 : 컴파일러에게 변수 선언문에서 추론하여 타입을 자동 선언하도록 지시
- C++11 이전까지는 스택에 할당되는 지역 변수를 선언하는 키워드
2. 장점 : 복잡한 변수 선언을 간소하게, 긴 타입 선언시 오타 줄임
3. 기본 사용 사례
auto pi = 3.14; //3.14가 실수이므로 pi는 double 타입으로 선언
auto n = 3; // 3이 정수이므로 n을 int 타입으로
auto *p = &n; // 변수 p는 int* 타입으로 추론
...
int n = 10;
int & ref = n; // ref는 int에 대한 참조 변수
auto ref2 = ref; // ref2는 int& 변수로 자동 선언
{예제 10-14 auto를 이용한 변수 선언}
#include <iostream>
#include <vector>
using namespace std;
int square(int x) { return x*x; }
int main() {
// 기본 타입 선언에 auto 활용
auto c = 'a'; // c는 char 타입으로 결정
auto pi = 3.14; // pi은 double 타입으로 결정
auto ten = 10; // ten은 int 타입으로 결정
auto *p = &ten; // 변수 p는 int* 타입으로 결정
cout << c << " " << pi << " " << ten << " " << *p << endl;
// 함수의 리턴 타입으로 추론
auto ret = square(3); // square() 함수의 리턴 타입이 int 이므로 ret는 int로 결정
cout << *p << " " << ret << endl;
vector<int> v = { 1,2,3,4,5 }; //벡터 v에 5개의 원소, 1,2,3,4,5 삽입
vector<int>::iterator it;
for (it = v.begin(); it != v.end(); it++)
cout << *it << " "; // 1 2 3 4 5 출력
cout << endl;
// 템플릿에 auto를 사용하여 간소화
for (auto it = v.begin(); it != v.end(); it++)
cout << *it << " "; // 1 2 3 4 5 출력
}
'Programming > C++' 카테고리의 다른 글
[C++ 스터디] 템플릿과 표준 템플릿 라이브러리{STL}_(1) (0) | 2022.12.04 |
---|---|
[C++ 스터디] 상속(1) (1) | 2022.11.27 |
[C++ 스터디] static 멤버 (0) | 2022.11.20 |
[C++ 스터디] 참조리턴 / 복사 생성자 / 함수 중복 (0) | 2022.11.13 |
[C++ 스터디] 객체 치환 및 객체 리턴 | Vector (0) | 2022.11.06 |