제6장 객체배열과 벡터 객체 배열을 이해한다. 벡터(vector) 클래스를 사용할 수 있다.
이번 장에서 만들어볼 프로그램
객체 배열 원을 나타내는 객체를 여러 개 생성하여서 화면에 그려보 는 프로그램을 작성하고자 한다. Circle c1; ...
객체 배열
예제 #include <iostream> using namespace std; class Circle { public: int x, y; int radius; Circle() : x{ 0 }, y{ 0 }, radius{ 0 } { } Circle(int x, int y, int r) : x{ x }, y{ y }, radius{ r } { } void print() { cout << "반지름: " << radius << " @(" << x << ", " << y <<")" << endl; } };
예제 #include <iostream> using namespace std; class Pizza { public: Pizza(int s) : size(s) { } int size; // 단위: 인치 }; Pizza createPizza() { Pizza p(10); return p; } int main() { Pizza pizza = createPizza(); cout << pizza.size << "인치 피자" << endl; return 0;
예제 int main(void) { Circle objArray[10]; for (Circle& c: objArray) { c.x = rand()%500; c.y = rand()%300; c.radius = rand()%100; } for (Circle c: objArray) c.print(); return 0; 예제
객체 배열의 초기화 Circle objArray[10] = { Circle(100, 100, 30), ... };
Lab: 책들을 저장해보자. 여러 권의 책을 저장할 수 있는 객체 배열 books를 생성 하여 보자.
Solution #include <iostream> #include <string> using namespace std; class Book { string title; int price; public: Book(string name, int price) : title{ name }, price{ price } { } void print() { cout << "제목:" << title << ", 가격:" << price << endl; } };
Solution int main(void) { Book books[2] = { Book("어서와 C++", 25000), }; cout << "소장하고 있는 책 정보" << endl; cout << "======================" << endl; for (Book& b : books) b.print(); return 0; }
Lab: 원들을 저장해보자. 10개의 원을 저장할 수 있는 배열을 선언하고 사용자가 키 ‘c'를 누르면 각각의 원의 위치와 반지름을 난수로 초 기화한 후에 화면에 그린다. 사용자가 키 ‘q'를 누르면 프 로그램을 종료한다.
Solution #include <windows.h> #include <conio.h> #include <iostream> using namespace std; class Circle { public: int x, y; int radius; Circle() : x{ 0 }, y{ 0 }, radius{ 0 } { } Circle(int x, int y, int r) : x{ x }, y{ y }, radius{ r } { } void draw() { int r = radius/2; HDC hdc = GetWindowDC(GetForegroundWindow()); Ellipse(hdc, x-r, y-r, x+r, y+r); } };
Solution int main(void) { Circle objArray[10]; while(true){ for (Circle& c: objArray) { c.x = rand()%500; c.y = rand()%300; c.radius = rand()%100; c.draw(); } char ch = getch(); if (ch == 'q') break; return 0;
벡터 벡터(vector)는 동적 배열이다. 컴파일 시간에 배열의 크기를 미리 결정할 필요가 없다.
벡터의 선언
벡터의 사용 #include <vector> #include <iostream> using namespace std; int main(void) { vector<int> fibonacci { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 }; for (auto& number : fibonacci) cout << number << ' '; cout << endl; return 0; }
push_back()과 pop_back()
벡터의 사용 #include <vector> #include <iostream> using namespace std; int main(void) { vector<int> v1; v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); v1.push_back(50); cout << "v1 = "; for (auto& e : v1) { cout << e << " "; } cout << endl; return 0;
실행결과
벡터의 사용 #include <vector> #include <iostream> using namespace std; int main(void) { vector<int> v; for (int i = 0; i < 10; ++i) { v.push_back(i); } cout << "현재의 v = "; for (auto& e : v) cout << e << " "; cout << endl; cout << "삭제 요소 = "; // 벡터가 공백이 될 때까지 pop_back() 호출 while (v.empty() != true) { cout << v.back() << " "; v.pop_back(); 벡터의 사용
실행결과
벡터에서 요소의 위치 벡터에서 요소의 위치는 반복자(iterator)를 이용하여 표 시한다. for (auto p = v.begin(); p != v.end(); ++p) cout << *p << endl;
벡터의 중간에서 삭제 v.erase(v.begin()+i);
벡터와 연산자 #include <vector> #include <iostream> using namespace std; int main(void) { vector<int> v1{ 1, 2, 3, 4, 5 }; vector<int> v2(v1); if (v1 == v2) { cout << "2개의 벡터가 일치합니다. " << endl; } return 0;
벡터에 문자열 저장 #include <iostream> #include <vector> #include <string> using namespace std; int main(void) { vector<string> vec; // 벡터를 생성한다. vec.push_back("MILK"); // 벡터의 끝에 자료를 저장한다. vec.push_back("BREAD"); vec.push_back("BUTTER"); for (auto e : vec) { cout << " " << e; } cout << endl; return 0;
벡터에 Circle 객체를 저장 #include <iostream> #include <vector> using namespace std; class Circle { public: int x, y; int radius; Circle() : x{ 0 }, y{ 0 }, radius{ 0 } { } Circle(int x, int y, int r) : x{ x }, y{ y }, radius{ r } { } void print() { cout << "반지름: " << radius << " @(" << x << ", " << y <<")" << endl; } };
벡터에 Circle 객체를 저장 int main(void) { vector<Circle> objArray; for (int i = 0; i < 10; i++) { Circle obj{ rand()%300, rand()%300, rand()%100 }; objArray.push_back(obj); } for (Circle c : objArray) c.print(); return 0;
실행결과
벡터와 알고리즘 #include <iostream> #include <algorithm> #include <vector> #include <string> using namespace std; class Person { private: string name; int age; public: Person::Person(string n, int a) { name = n; age = a; } string get_name() { return name; } int get_age() { return age; } void print() { cout << name << " " << age << endl; };
벡터와 알고리즘 bool compare(Person &p, Person &q) { return p.get_age() < q.get_age(); } int main() vector<Person> list; list.push_back(Person("Kim", 30)); list.push_back(Person("Park", 22)); list.push_back(Person("Lee", 26)); sort(list.begin(), list.end(), compare); for (auto& e : list) { e.print(); return 0;
실행결과
Lab: 성적평균 계산하기 학생들의 평균 성적을 계산하는 예제에서 학생이 몇 명인 지 알 수 없다고 하자. 동적 배열인 벡터를 이용하여서 작 성해보자.
Solution #include <iostream> #include <vector> using namespace std; int main() { vector<int> scores; // int 동적 배열을 생성한다. int i, sum = 0; while (true) { int score; cout << "성적을 입력하시오(종료는 -1) : "; cin >> score; if (score == -1) break; scores.push_back(score); } for (auto& value : scores) { sum += value; double avg = (double)sum / scores.size(); cout << "성적 평균=" << avg << endl; return 0; Solution
Lab: 영화정보 저장 벡터를 이용하여 영화에 대한 정보를 저장했다가 출력하 는 프로그램을 작성해보자.
Solution #include <iostream> #include <string> #include <vector> using namespace std; class Movie { private: string title; double rating; public: Movie(string t = "", double r = 0.0) { title = t; rating = r; } void print_movie() { cout << title << ": " << rating << endl; } };
Solution int main(void) { vector<Movie> movies; movies.push_back(Movie("titinic", 9.9)); movies.push_back(Movie("gone with the wind", 9.6)); movies.push_back(Movie("terminator", 9.7)); for (auto& e : movies) e.print_movie(); return 0; }
array 클래스 vector는 생성과 소멸을 하는데 상당한 시간이 소요된다. 따라서 vector의 장점이 많지만 성능 때문에 기존의 배열 을 사용하는 경우도 많다. 이 문제를 해결하기 위해 C++11에서는 std::array를 새롭 게 제시하였다. array 클래스를 사용하면 벡터의 장점과 기존 배열의 성능을 동시에 누릴 수 있다.
예제 #include <iostream> #include <array> using namespace std; int main() { array<int, 3> list{ 1, 2, 3 }; for (int i = 0; i<list.size(); ++i) ++list[i]; for (auto& elem : list) cout << elem << " "; cout << endl; return 0; }
Q & A