10์ฅ ์์
ํ ํ๋ฆฟ
ํจ์๋ ํด๋์ค ์ฝ๋๋ฅผ ์ฐ์ด๋ด๋ฏ์ด ์์ฐํ ์ ์๋๋ก ์ผ๋ฐํ(generic)์ํค๋ ๋๊ตฌ
์ ์ธ
template <class T>
// ์ฌ๊ธฐ์ T ์์๋ก ๋ถ์ธ ๊ฒ์ด๋ฉฐ ์ด๋ค ์ด๋ฆ์ ์ฌ์ฉํด๋ ์๊ด์๋ค.
template <class T1, class T2, class T3>
// ์ฌ๋ฌ๊ฐ๋ฅผ ์ ์ธ ํ ์๋ ์๋ค. ์ด๋ฅผ ์ด์ฉํด ์ฌ๋ฌ๊ฐ์ ์๋ฃํ์ ์ฌ์ฉํ ์ ์๋ค.
์ฌ์ฉ ์์) ํจ์ ์ค๋ณต
#include <iostream>
using namespace std;
void Swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
void Swap(double &a, double &b)
{
double temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int a = 1, b = 2;
double c = 3.0, d = 0.14;
cout << a << " " << b << endl;
cout << c << " " << d << endl;
Swap(a, b);
Swap(c, d);
cout << "์ค์ ํ" << endl;
cout << a << " " << b << endl;
cout << c << " " << d << endl;
}
์ swap ํจ์ ์ค๋ณต์ ํจ์์ ๋งค๊ฐ๋ณ์์ ํ๋ง ๋ค๋ฅด์ง ์ํ๊ณผ์ ์ ๋๊ฐ๋ค.
ํ ํ๋ฆฟ์ ์ฌ์ฉํ ๊ฒฝ์ฐ)
#include <iostream>
using namespace std;
template <class T>
void Swap(T &a, T &b)
{
T temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int a = 1, b = 2;
double c = 3.0, d = 0.14;
cout << a << " " << b << endl;
cout << c << " " << d << endl;
Swap(a, b);
Swap(c, d);
cout << "์ค์ ํ" << endl;
cout << a << " " << b << endl;
cout << c << " " << d << endl;
}
ํจ์๋ฅผ ์ผ๋ฐํํ์ฌ genericํจ์๋ก ๋ง๋ ๋ค๋ฉด, ์ ์ฒ๋ผ ๊ฐ๋จํ๊ฒ ์ธ ์ ์๋ค.
์ฌ์ฉ์ ๋ฐ๋ผ T์ ํ์ด ๋ฐ๋๋ ๊ณผ์ ์ "๊ตฌ์ฒดํ"๋ผ๊ณ ํ๋ค.
โ ๏ธ ์ ๋ค๋ฆญ ํจ์์ ์ผ๋ฐํจ์๋ฅผ ์ค๋ณต์ ์ธ ํ ๊ฒฝ์ฐ ์ฐ์ ์์๋ ์ผ๋ฐํจ์์ ์ฐ์ ์์๊ฐ
โโโ ๋ ๋์ ์ผ๋ฐํจ์๋ฅผ ๋ฐ์ธ๋ฉํ๋ค.
โโโ์ ๋ฅ๋ฆญ ํจ์์๋ ๋ํดํธ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ ์ ์๋ค.
generic ํด๋์ค
genericํด๋์ค๋ ๋ง๋ค ์ ์๋ค.
ํ์ฉ ์)
// ์ ์ธ๋ถ
template <class T>
class MyStack{
int tos;
T data[100];
public:
MyStack();
void push(T element);
T pop();
};
// ๊ตฌํ๋ถ
template <class T>
void MyStack<T>::push(T element) {
}
template <class T> T MyStack<T>::pop() {
}
int main()
{
// ๊ฐ์ฒด ์์ฑ
MyStack<int> iStack;
MyStack<double> dStack;
MyStack<int *> ipStack; // int* ์คํ
MyStack<Point> pointStack; // Pointํด๋์ค ์คํ
// ๋์ ์์ฑ
MyStack<char> *p = new MyStack<char>();
delete p;
}
STL
ํ ํ๋ฆฟ์ผ๋ก ์์ฑ๋ ๋ง์ ์ ๋ค๋ฆญ ํด๋์ค์ ํจ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Container
ํ ํ๋ฆฟ ํด๋์ค, ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ๊ธฐ ์ํด ๋ด์๋๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ ํด๋์ค
์ข ๋ฅ : ๋ฆฌ์คํธ(list), ํ(queue), ์คํ(stack), ๋ฒกํฐ(vector), ๋ํ(deque),
์ (set), ๋งต(map) ๋ฑiterator
๋ฐ๋ณต์, ์ปจํ ์ด๋ ์์์ ๋ํ ํฌ์ธํฐ, ์์๋ค์ ํ๋์ฉ ์ํ ์ ๊ทผํ๊ธฐ์ํด ๋ง๋ฌ
์๊ณ ๋ฆฌ์ฆ
ํ ํ๋ฆฟ ํจ์ ์ปจํ ์ด๋ ์์์ ์ํํ ํ ํ๋ฆฟ ํจ์, ํด๋์ค์ ๋ฉค๋ฒํจ์๊ฐ ์๋๋ค.
์ข ๋ฅ : copy, find, random, swap, sort, min, max ๋ฑ
#include <vector> // vector์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด
โ ๏ธvector์ ์์์ญ์
vector<int> v;
/* ..... */
vector<int>::iterator it; // iterator๋ณ์ ์์ฑ
it = v.begin(); // ๋ฒกํฐ์ 0๋ฒ์งธ ์์ ๊ฐ๋ฆฌํด
it = v.erase(it); // ์ฒซ๋ฒ์งธ ์์ ์ญ์
it = v.erase(it);
// it๊ฐ ๊ฐ๋ฆฌํค๋ ์์๋ฅผ ์ญ์ ํ it๋ค์ ์์๋ค์ ๋ชจ๋ ํ์นธ ์ฉ ๋น๊ธด๋ค.
// ๊ทธ๋ฆฌ๊ณ ์ญ์ ๋์๋ ์์์ ๋ค์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ๋ฆฌํดํ๋ค.
// ๋ฐ๋ผ์ erase()์ ๋ฆฌํด๊ฐ์ผ๋ก it ์ฌ์ค์
โ ๏ธ iterator๊ด๋ จ
vector<int>::iterator it; // iterator๋ณ์ ์์ฑ
it = v.begin(); // ๋ฒกํฐ v์ 0๋ฒ์งธ ์์ ๊ฐ๋ฆฌํด
it++ // ๋ฒกํฐ v์ 0๋ฒ์งธ ์์ ๊ฐ๋ฆฌํด
int n = *it; // n์ ํ์ฌ it๊ฐ v์์ ๊ฐ๋ฆฌํค๋ ๊ฐ์ n์ ๋ฃ์
*it = 8; // ํ์ฌ v์์ it๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ 8์ ๋ฃ๋๋ค.
v.end() // v์ ๋ง์ง๋ง ์์ ๋ค์ ์์น์ ๋ํ ์ฃผ์ ๋ฆฌํด
// v์ ๋ชจ๋ ์์ ๊ฒ์ ๋ฐฉ๋ฒ
for(it = v.begint(); it != v.end(); it++)
{
int n = *it;
cout << n << endl;
}
vector ๊ด๋ จ
https://blockdmask.tistory.com/70
๋ค๋ฅธ ์ธ์ด์ Dictionary์ ๊ฐ์ ํํ
ํค์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ์ด ๋์ด์๋ค.
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<string, string> dic;
dic.insert(make_pair("peace", "ํํ")); // dic์ ("peace", "ํํ") ์ ์ฅ
dic["Love"] = "์ฌ๋"; // dic์ ("Love", "์ฌ๋") ์ ์ฅ
string peaceKor = dic["peace"];
string loveKor = dic.at("Love");
cout << peaceKor << " " << loveKor << endl;
// ์์ ์ฐพ๋ ๋ฐฉ๋ฒ
// ์์ผ๋ฉด true ์์ผ๋ฉด false๋ฅผ ๋ฆฌํดํ๋ค.
if(dic.find("eng") == dic.end())
{
cout << "eng๋ ์์ต๋๋ค." << endl;
}
if(dic.find("Love") == dic.end())
{
cout << "Love ์์ต๋๋ค." << endl;
}
}
์ถ๋ ฅ
STL์๊ณ ๋ฆฌ์ฆ์ ์ ์ญ ํจ์๋ก ์ปจํ ์ด๋์ ํด๋์ค ๋ฉค๋ฒ๊ฐ ์๋ ํ ํ๋ฆฟ์ผ๋ก ์์ฑ๋์ด ์๋ค.
#include <algorithm>
// ์ฌ์ฉํ๊ธฐ์ํด์ ์๊ณ ๋ฆฌ์ฆ ํค๋ํ์ผ์ ์ถ๊ฐํด์ค์ผ ํ๋ค.
sort(v.begin(), v.end()); // v์ ์ฒ์๋ถํฐ ๋๊น์ง ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
auto
์ปดํ์ผ๋ฌ๊ฐ ๋ณ์ํ์ ์ ์ถ๋ก ํด์ ๋ถ์ฌ์ค๋ค.
๋ณ์์ ํ์ ๋ฐ๋ก ์ง์ ์ํด์ค๋ ๋์ด ์๋ฃํ ๊ด๋ จ syntax์ค๋ฅ ํด๊ฒฐํ๋๋ฐ ์ฅ์
// b์ ์๋ฃํ์ int๊ฐ ๋๋ค.
int a = 3;
auto b = a;
๋๋ค ๋์์ ๋๋ค์
์ํ์์ ์ด๋ฆ ์๋ ํจ์๋ฅผ ๋๋ค์์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ํ๋ก๊ทธ๋๋ฐ์์๋ ์ด๋ฆ ์๋ ์ต๋ช ํจ์๋ฅผ ๋๋ค์ ๋๋ ๋๋ค ํจ์๋ผ๊ณ ๋ถ๋ฅธ๋ค.
โ ๏ธ
1. ๊ผญ ํ์ํ ๊ธฐ๋ฅ์ ์๋์ง๋ง, ์งง๊ณ ๊ฐ๊ฒฐํ ์ฝ๋ ์์ฑํ๋๋ฐ ์ข๋ค.
2. ํ๋ฒ๋ง ํธ์ถํ๊ณ ์ฌ์ฌ์ฉ ์ํ๋ ํจ์ ์ฌ์ฉ์ ์ฌ์ฉํ๋ฉด ์ ์ฉ
3. STL์๊ณ ๋ฆฌ์ฆ ํจ์์ ๋งค๊ฐ๋ณ์์ ์ฐ์ฐ ์ฝ๋๋ฅผ ๋๊ธฐ๋ ๊ฒฝ์ฐ, ์ฐ์ฐ ์ฝ๋๋ฅผ ์ต๋ช ์ ๋๋ค์์ผ๋ก ์์ฑ
์ ์ธ
[์บก์ณ๋ฆฌ์คํธ](๋งค๊ฐ๋ณ์ ๋ฆฌ์คํธ)->๋ฆฌํดํ์ (์๋ต ๊ฐ๋ฅ){ํจ์ ๋ฐ๋}
์บก์ณ๋ฆฌ์คํธ : ๋๋ค์ ์ธ๋ถ์ ์ ์ธ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ ๋ฃ๋๋ค.
[x] : ๋ณ์ x์ ๊ฐ ํ์ฉ
[&x] : ์ฐธ์กฐ ๋ณ์ x ํ์ฉ
[=] : ๋ชจ๋ ๋ณ์ ํ์ฉ
[&] : ๋ชจ๋ ์ฐธ์กฐ ๋ณ์ ํ์ฉ
๋งค๊ฐ๋ณ์ ๋ฆฌ์คํธ : ๋ณดํต ํจ์์ ๋งค๊ฐ ๋ณ์ ๋ฆฌ์คํธ์ ๊ฐ๋ค.
ํจ์ ๋ฐ๋ : ์คํํ๊ณ ์ ํ๋ ์ฝ๋
#include <iostream>
using namespace std;
int main()
{
[](int x, int y) {cout << x + y;};
[](int x, int y) -> int { return x + y;};
[](int x, int y){ cout << x + y;}(2,3); // 5์ถ๋ ฅ
}
๋๋ค์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ
auto ๋ณ์๋ฅผ ํ์ฉํ๋ค.
์์ 1
#include <iostream>
#include <string>
using namespace std;
int main()
{
auto building = [](string a, string b){
cout << a << "๊ฐ " << b << "๋ณด๋ค ๋ฎ๋ค." << endl;
};
building("๊ดํ๋ฌธ", "63๋น๋ฉ");
building("63๋น๋ฉ", "๋กฏ๋ฐํ์");
}
์์ 2
#include <iostream>
using namespace std;
int main()
{
double pi = 3.14;
auto area = [pi](double r) ->double {return pi * r * r;};
cout << area(10) << endl;
// ์ถ๋ ฅ : 314
}
์์ 3
#include <iostream>
using namespace std;
int main()
{
int pow = 0;
[&pow](int r){pow = r * r;} (15);
cout << pow << endl;
// ์ถ๋ ฅ : 225
}
1. ์ ์ ๋ฐฐ์ด
๊ตฌ์ฒดํ๋ฅผ ํตํด autoArr์ intํ์ด ๋๊ณ arr์ด ๋ณต์ฌ๋์ด ๋ค์ด๊ฐ๋ค.
๋ณต์ฌ๋์์ผ๋ฏ๋ก ๊ฐ์ด ๋ฐ๋์ง ์๋๋ค.
#include <iostream>
using namespace std;
int main()
{
int arr[5] = {1, 2, 3, 4, 5};
for(auto autoArr : arr){
autoArr *= 3;
cout << autoArr << " ";
}
cout << endl;
for(int i = 0; i < 5; i++)
{
cout << arr[i] << " ";
}
}
// ์ถ๋ ฅ 3 6 9 12 15
// 1 2 3 4 5
2. ์ ์ ๋ฐฐ์ด (์ฐธ์กฐ ์ฌ์ฉ)
๊ตฌ์ฒดํ๋ฅผ ํตํด autoArr์ intํ์ด ๋๊ณ arr์ด ๋ณต์ฌ๋์ด ๋ค์ด๊ฐ๋ค.
๋ณต์ฌ๋์์ผ๋ฏ๋ก ๊ฐ์ด ๋ฐ๋์ง ์๋๋ค.
#include <iostream>
using namespace std;
int main()
{
int arr[5] = {1, 2, 3, 4, 5};
for(auto &autoArr : arr){
autoArr *= 3;
cout << autoArr << " ";
}
cout << endl;
for(int i = 0; i < 5; i++)
{
cout << arr[i] << " ";
}
}
// ์ถ๋ ฅ 3 6 9 12 15
// 3 6 9 12 15
3. foreach๋ฌธ์์ ๋์ ๋ฐฐ์ด์ ์ฌ์ฉํ ์ ์๋ค. ๋์ ์ vector๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ ๋ฐฐ์ด์ ์ฌ์ฉํ ์ ์๋ค.
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> arr = {1,2,3,4,5};
for(auto autoArr : arr){
autoArr *= 3;
cout << autoArr << " ";
}
cout << endl;
for(int i = 0; i < 5; i++)
{
cout << arr[i] << " ";
}
}
// ์ถ๋ ฅ 3 6 9 12 15
// 1 2 3 4 5
4. STLํ
ํ๋ฆฟ๊ณผ algorithm ํค๋ํ์ผ์ for_each()ํจ์ ์ฌ์ฉ๋ฐฉ๋ฒ
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void print(int n){
cout << n << " ";
}
int main()
{
vector<int> arr = {1,2,3,4,5};
for_each(arr.begin(), arr.end(), print);
// arr์ ์ฒ์๋ถํฐ ๋๊น์ง ์์๋ค์ ๊ฒ์ํ๋ฉด์ ๊ฐ ์์๋ฅผ print์ ๋งค๊ฐ๋ณ์ n์ผ๋ก ๋๊ฒจ์ค๋ค.
}
// ์ถ๋ ฅ
// 1 2 3 4 5
5. STLํ
ํ๋ฆฟ๊ณผ algorithm ํค๋ํ์ผ์ for_each()ํจ์ + ๋๋ค์
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> arr = {1,2,3,4,5};
for_each(arr.begin(), arr.end(), [](int n){cout << n << " ";});
}
6. ๋ฒ์ ๊ธฐ๋ฐ for๋ฌธ
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> arr = {1,2,3,4,5};
// 1. ํ ์ง์
for(int n : arr)
{
cout << n << " ";
}
// 2. auto
for(auto &n : arr)
{
cout << n << " ";
}
}
๋ช ํ C++ํ๋ก๊ทธ๋๋ฐ ์ฑ
https://book.naver.com/bookdb/book_detail.naver?bid=13395206
โ ๏ธ ์ฃผ์ โ ๏ธ
1. ์ฌ๊ธฐ์๋ถํฐ๋ ์ค์ต๋ฌธ์ ์ ๋ต์ ๋๋ค.
2.์ ๊ฐ ์์ฑํ ์ ๋ต์ด ํ๋ฆด ์ ์์ต๋๋ค. ํน์ ํ๋ฆฐ๊ฒ ์๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ๊ฐ์ฌํ ์์ ํ๊ฒ ์ต๋๋ค.
3. C++๋ฅผ ๊ณต๋ถํ์๋ ํ์์ด์๋ผ๋ฉด ๋ณด์๊ธฐ ์ ์ ์ง์ ๊ผญ ํ ๋ฒ ํ์ด๋ณด์ธ์!
_์ค์ต ๋ฌธ์ 10 - 1
๋ฌธ์ : ์ ๋ค๋ฆญ ํจ์ biggest() ์์ฑํ๊ธฐ
#include <iostream>
using namespace std;
template <class T>
T biggest(T *arr, int size)
{
T max = arr[0];
for(int i = 1; i < size; i++)
{
if(max < arr[i])
max = arr[i];
}
return max;
}
int main()
{
int iArr[5] = {1, 2, 3, 4, 5};
cout << biggest(iArr, 5) << endl;
double dArr[5] = {1.2, 3.4, 4.5, 5.6, 7.8};
cout << biggest(dArr, 5) << endl;
char cArr[5] = {'F', 'Z', 'T', 'O', 'A'};
cout << biggest(cArr, 5);
}
ย
_์ค์ต ๋ฌธ์ 10 - 2
๋ฌธ์ : ์ ๋ค๋ฆญ ํจ์ equalArrays() ์์ฑํ๊ธฐ
#include <iostream>
using namespace std;
template <class T>
bool equalArray(T *arr1, T *arr2, int size)
{
for(int i = 0; i < size; i++)
{
if(arr1[i] != arr2[i]){
return false;
}
}
return true;
}
int main()
{
int iArr1[5] = {1, 2, 3, 4, 5};
int iArr2[5] = {1, 2, 3, 4, 5};
if(equalArray(iArr1, iArr2, 5))
cout << "๊ฐ๋ค" << endl;
else
cout << "๋ค๋ฅด๋ค" << endl;
double dArr1[5] = {1.2, 3.4, 4.5, 5.6, 7.8};
double dArr2[5] = {1.2, 4.5, 5.6, 9.0, 7.8};
if(equalArray(dArr1, dArr2, 5))
cout << "๊ฐ๋ค" << endl;
else
cout << "๋ค๋ฅด๋ค" << endl;
char cArr1[5] = {'F', 'X', 'T', 'O', 'A'};
char cArr2[5] = {'F', 'Z', 'T', 'O', 'A'};
if(equalArray(cArr1, cArr2, 5))
cout << "๊ฐ๋ค" << endl;
else
cout << "๋ค๋ฅด๋ค" << endl;
}
ย
_์ค์ต ๋ฌธ์ 10 - 3
๋ฌธ์ : ์ ๋ค๋ฆญ ํจ์ reverseArray() ์์ฑํ๊ธฐ
#include <iostream>
using namespace std;
template <class T>
void reverseArray(T *arr, int size)
{
for(int i = 0; i < size / 2; i++)
{
swap(arr[i], arr[size - i - 1]);
}
}
int main()
{
int iArr[5] = {1, 2, 3, 4, 5};
reverseArray(iArr, 5);
for(int i = 0; i < 5; i++)
{
cout << iArr[i] << " ";
}
cout << endl;
double dArr[5] = {1.2, 3.4, 4.5, 5.6, 7.8};
reverseArray(dArr, 5);
for(int i = 0; i < 5; i++)
{
cout << dArr[i] << " ";
}
cout << endl;
char cArr[5] = {'F', 'X', 'T', 'O', 'A'};
reverseArray(cArr, 5);
for(int i = 0; i < 5; i++)
{
cout << cArr[i] << " ";
}
cout << endl;
}
ย
_์ค์ต ๋ฌธ์ 10 - 4
๋ฌธ์ : ์ ๋ค๋ฆญ ํจ์ search() ์์ฑํ๊ธฐ
#include <iostream>
using namespace std;
template <class T>
bool search(T num, T *arr, int size)
{
for(int i = 0; i < size; i++)
{
if(num == arr[i])
return true;
}
return false;
}
int main()
{
int iArr[5] = {1, 2, 3, 4, 5};
if(search(3, iArr, 5))
cout << 3 << " ์ฐพ์๋ค!" << endl;
else
cout << 3 << " ๋ชป์ฐพ์๋ค.." << endl;
double dArr[5] = {1.2, 3.4, 4.5, 5.6, 7.8};
if(search(5.6, dArr, 5))
cout << 5.6 << " ์ฐพ์๋ค!" << endl;
else
cout << 5.6 << " ๋ชป์ฐพ์๋ค.." << endl;
char cArr[5] = {'F', 'X', 'T', 'O', 'A'};
if(search('Z', cArr, 5))
cout << 'Z' << " ์ฐพ์๋ค!" << endl;
else
cout << 'Z' << " ๋ชป์ฐพ์๋ค.." << endl;
}
ย
_์ค์ต ๋ฌธ์ 10 - 5
๋ฌธ์ : ์ ๋ค๋ฆญ ํจ์ concat() ์์ฑํ๊ธฐ
#include <iostream>
using namespace std;
template <class T>
T* concat(T a[], int sizea, T b[], int sizeb){
T *arr = new T[sizea + sizeb];
for(int i = 0; i < sizea; i++)
{
arr[i] = a[i];
}
for(int i = sizea; i < sizeb + sizea; i++)
{
arr[i] = b[i - sizea];
}
return arr;
}
template <class T>
void print(T *arr, int size)
{
for(int i = 0; i < size; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
int iArr1[5] = {1, 2, 3, 4, 5};
int iArr2[5] = {6, 7, 8, 9, 10};
int *iArr = concat(iArr1, 5, iArr2, 5);
print(iArr, 10);
double dArr1[5] = {1.2, 3.4, 4.5, 5.6, 7.8};
double dArr2[5] = {8.9, 0.1, 2.3, 4.5, 6.7};
double *dArr = concat(dArr1, 5, dArr2, 5);
print(dArr, 10);
char cArr1[5] = {'A', 'B', 'C', 'D', 'E'};
char cArr2[5] = {'F', 'G', 'H', 'I', 'J'};
char *cArr = concat(cArr1, 5, cArr2, 5);
print(cArr, 10);
}
ย
_์ค์ต ๋ฌธ์ 10 - 6
๋ฌธ์ : ์ ๋ค๋ฆญ ํจ์ equalArrays() ์์ฑํ๊ธฐ
#include <iostream>
using namespace std;
template <class T>
T* remove(T src[], int sizeSrc, T minus[], int sizeMinus, int &retsize)
{
for(int i = 0; i < sizeMinus; i++)
{
for(int j = 0; j < sizeSrc;)
{
if(minus[i] == src[j])
{
for(int k = j; k < sizeSrc - 1; k++)
{
src[k] = src[k + 1];
}
sizeSrc--;
if(sizeSrc == 0)
return src;
continue;
}
j++;
}
}
retsize = sizeSrc;
T *arr = new T[retsize];
for(int i = 0; i < retsize; i++)
{
arr[i] = src[i];
}
return arr;
}
template <class T>
void print(T *arr, int size)
{
for(int i = 0; i < size; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
int size = 0;
int iArr1[5] = {1, 2, 3, 4, 5};
int iArr2[5] = {4, 7, 5, 9, 10};
int *iArr = remove(iArr1, 5, iArr2, 5, size);
print(iArr, size);
double dArr1[5] = {1.2, 3.4, 4.5, 5.6, 7.8};
double dArr2[5] = {8.9, 3.4, 2.3, 4.5, 1.2};
double *dArr = remove(dArr1, 5, dArr2, 5, size);
print(dArr, size);
char cArr1[5] = {'A', 'B', 'C', 'D', 'E'};
char cArr2[5] = {'A', 'G', 'H', 'I', 'E'};
char *cArr = remove(cArr1, 5, cArr2, 5, size);
print(cArr, size);
}
ย
_์ค์ต ๋ฌธ์ 10 - 7
๋ฌธ์ : ์ค๋ฅ ์ฐพ๊ธฐ
ํด๋์ค์ ๊ฐ์ ํฌ๊ธฐ ๋น๊ต๋ฅผ ํ ์ ์์ด์ ์ค๋ฅ ๋ฐ์
#include <iostream>
using namespace std;
class Circle{
int radius;
public:
Circle(int radius = 1) {this->radius = radius;}
int getRadius() {return radius;}
};
template <class T>
T bigger(T a, T b)
{
return a > b ? a : b;
}
int main()
{
int a = 20, b = 50, c;
c = bigger(a, b);
cout << "20๊ณผ 50์ค ํฐ ๊ฐ์ " << c << endl;
Circle waffle(10), pizza(20), y;
y = bigger(waffle.getRadius(), pizza.getRadius());
cout << "waffle๊ณผ pizza ์ค ํฐ ๊ฒ์ ๋ฐ์ง๋ฆ์ " << y.getRadius() << endl;
}
ย
_์ค์ต ๋ฌธ์ 10 - 8
๋ฌธ์ : 7๋ฒ ๋ฌธ์ ์ฐ์ฐ์ ์ค๋ณต์ผ๋ก ํด๊ฒฐํ๊ธฐ
#include <iostream>
using namespace std;
class Comparable{
public:
virtual bool operator > (Comparable& op2) = 0;
virtual bool operator < (Comparable& op2) = 0;
virtual bool operator == (Comparable& op2) = 0;
};
class Circle : public Comparable{
int radius;
public:
Circle(int radius = 1) {this->radius = radius;}
int getRadius() {return radius;}
// ๋ค์ด์บ์คํ
bool operator > (Comparable &op2) override {
Circle *temp = (Circle *)&op2;
if(this->radius > temp->radius)
return true;
return false;
}
bool operator < (Comparable &op2) override {
Circle *temp = (Circle *)&op2;
if(this->radius < temp->radius)
return true;
return false;
}
bool operator == (Comparable &op2) override {
Circle *temp = (Circle *)&op2;
if(this->radius == temp->radius)
return true;
return false;
}
};
template <class T>
T bigger(T a, T b)
{
return a > b ? a : b;
}
template <class T>
T smaller(T a, T b)
{
return a < b ? a : b;
}
template <class T>
bool equal(T a, T b)
{
return a == b;
}
int main()
{
int a = 20, b = 50, c;
c = bigger(a, b);
cout << "20๊ณผ 50์ค ํฐ ๊ฐ์ " << c << endl;
Circle waffle(10), pizza(20), y;
y = bigger(waffle, pizza);
cout << "waffle๊ณผ pizza ์ค ํฐ ๊ฒ์ ๋ฐ์ง๋ฆ์ " << y.getRadius() << endl;
Circle waffle1(10), pizza1(20), y1;
y1 = smaller(waffle1, pizza1);
cout << "waffle๊ณผ pizza ์ค ์์ ๊ฒ์ ๋ฐ์ง๋ฆ์ " << y1.getRadius() << endl;
Circle waffle2(20), pizza2(20);
if(equal(waffle2, pizza2))
{
cout << "waffle๊ณผ pizza์ ๋ฐ์ง๋ฆ์ ์๋ก ๊ฐ๋ค.";
}
else
cout << "waffle๊ณผ pizza์ ๋ฐ์ง๋ฆ์ ์๋ก ๋ค๋ฅด๋ค.";
}
ย
_์ค์ต ๋ฌธ์ 10 - 9
๋ฌธ์ : STL์ vectorํด๋์ค ์ด์ฉํ๊ธฐ
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> v;
int num = 0, sum = 0;
while(true)
{
cout << "์ ์๋ฅผ ์
๋ ฅํ์ธ์(0์ ์
๋ ฅํ๋ฉด ์ข
๋ฃ)" << endl;
cin >> num;
if(num == 0)
break;
sum += num;
v.push_back(num);
for_each(v.begin(), v.end(), [](int n) {cout << n << " ";});
cout << endl << "ํ๊ท = " << (double)sum / v.size() << endl;
}
}
ย
_์ค์ต ๋ฌธ์ 10 - 10
๋ฌธ์ : vector๋ฅผ ์ด์ฉํด ๋๋ผ ์ด๋ฆ ์๋ ๋ง์ถ๊ธฐ ํ๋ก๊ทธ๋จ ๋ง๋ค๊ธฐ
#include <iostream>
#include <string>
#include <vector>
#include <random>
using namespace std;
class Nation{
string nation;
string capital;
public:
Nation(string nation, string capital){
this->nation = nation;
this->capital = capital;
}
void setInfo(string nation, string capital)
{
this->nation = nation;
this->capital = capital;
}
string getNation(){
return nation;
}
string getCapital(){
return capital;
}
};
int main()
{
vector<Nation> v = {Nation("ํ๊ตญ", "์์ธ"), Nation("์ผ๋ณธ", "๋์ฟ"),Nation("์๊ตญ", "๋ฐ๋"),
Nation("๋ฏธ๊ตญ", "์์ฑ"), Nation("๋
์ผ", "๋ฒ ๋ฅผ๋ฆฐ"), Nation("์ค๊ตญ", "๋ฒ ์ด์ง"),
Nation("ํ๋์ค", "ํ๋ฆฌ"), Nation("ํ๊ตญ", "๋ฐฉ์ฝ"), Nation("ํธ์ฃผ", "์บ๋ฒ๋ผ")};
vector<Nation>::iterator it;
cout << "***** ๋๋ผ์ ์๋ ๋ง์ถ๊ธฐ ๊ฒ์์ ์์ํฉ๋๋ค. *****" << endl;
random_device rd;
mt19937 gen(rd());
uniform_int_distribution dist;
int num = 0;
string nation, capital;
while (true)
{
cout << "์ ๋ณด ์
๋ ฅ: 1, ํด์ฆ: 2, ์ข
๋ฃ :3 >> ";
cin >> num;
if(num == 1)
{
cout << "ํ์ฌ " << v.size() << "๊ฐ์ ๋๋ผ๊ฐ ์
๋ ฅ๋์ด ์์ต๋๋ค." << endl;
cout << "๋๋ผ์ ์๋๋ฅผ ์
๋ ฅํ์ธ์(no no์ด๋ฉด ์
๋ ฅ๋)" << endl;
while(true)
{
bool chk = true;
cout << v.size() + 1 << ">>";
cin >> nation >> capital;
if(nation == "no" && nation == "no")
break;
for(it = v.begin(); it != v.end(); it++)
{
if(it->getNation() == nation)
{
cout << "already exists !!" << endl;
chk = false;
}
}
if(chk)
{
Nation temp(nation, capital);
v.push_back(temp);
}
}
}
if(num == 2)
{
while(true)
{
int n = dist(gen) % v.size();
cout << v[n].getNation() << "์ ์๋๋?";
cin >> capital;
if(capital == "exit")
break;
else if(capital == v[n].getCapital())
cout << "Correct !!" << endl;
else
cout << "NO !!" << endl;
}
}
if(num == 3)
break;
}
}
ย
_์ค์ต ๋ฌธ์ 10 - 11
๋ฌธ์ : vector์ Bookํด๋์ค๋ก ์ ์์ ๋
๋๋ฅผ ๊ฒ์ํ๋ ํ๋ก๊ทธ๋จ ์์ฑํ๊ธฐ
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Book{
string name;
string bookName;
int year;
public:
Book(int year, string bookName, string name){
this->year = year;
this->bookName = bookName;
this->name = name;
}
string getName() {return name;}
int getYear() {return year;}
void show(){
cout << year << "๋
๋, " << bookName << ", " << name << endl;
}
};
int main()
{
vector<Book> v;
string name;
string bookName;
int year;
cout << "์
๊ณ ํ ์ฑ
์ ์
๋ ฅํ์ธ์. ๋
๋์ -1์ ์
๋ ฅํ๋ฉด ์
๊ณ ๋ฅผ ์ข
๋ฃํฉ๋๋ค." << endl;
while(true)
{
cout << "๋
๋>>";
cin >> year;
cin.ignore();
if(year == -1)
break;
cout << "์ฑ
์ด๋ฆ>>";
getline(cin, bookName);
cout << "์ ์>>";
getline(cin, name);
Book temp(year, bookName, name);
v.push_back(temp);
}
cout << "์ด ์
๊ณ ๋ ์ฑ
์ " << v.size() <<"๊ถ์
๋๋ค." << endl;
int num = 0;
while(true)
{
cout << "์ด๋ค๊ฑธ๋ก ๊ฒ์ํ์๊ฒ ์ต๋๊น? 1: ์ ์์ด๋ฆ 2: ๋
๋ 3: ์ข
๋ฃ>>";
cin >> num;
if(num == 1)
{
cin.ignore();
cout << "์ ์ ์ด๋ฆ>>";
getline(cin, name);
for(auto arr : v){
if(arr.getName() == name)
arr.show();
}
}
if(num == 2)
{
cin.ignore();
cout << "๋
๋>>";
cin >> year;
for(auto arr : v){
if(arr.getYear() == year)
arr.show();
}
}
if(num == 3)
break;
}
}
ย
_์ค์ต ๋ฌธ์ 10 - 12
๋ฌธ์ : ๋จ์ด ์ํ ํ
์คํธ ํ๋ก๊ทธ๋จ ๋ง๋ค๊ธฐ
#include <iostream>
#include <vector>
#include <random>
using namespace std;
class Word{
string jpn;
string kor;
public:
Word(){
jpn = "";
kor = "";
}
Word(string eng, string kor) { this->jpn = eng; this->kor = kor;}
void setJpn(string eng){this->jpn = eng;}
void setKor(string kor){this->kor = kor;}
string getJpn(){return jpn;}
string getKor(){return kor;}
};
int main()
{
string jpn;
string kor;
int num = 0;
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<int> dist;
Word words[4];
vector<Word> v = {Word("ใใ", "๋ณต์ญ์"), Word("ใใกใ", "๋ธ๊ธฐ"),
Word("ใฟใใ", "๊ทค"), Word("ใใใ", "๋ฐ๋๋")};
cout << "***** ์ผ์ด ์ดํ ํ
์คํธ๋ฅผ ์์ํฉ๋๋ค. *****" << endl;
while(true)
{
cout << "์ดํ ์ฝ์
: 1, ์ดํ ํ
์คํธ: 2, ํ๋ก๊ทธ๋จ ์ข
๋ฃ:๊ทธ์ธํค >> ";
cin >> num;
if(num == 1)
{
cout << "์ผ์ด ๋จ์ด์ ใใใ๋ฅผ ์
๋ ฅํ๋ฉด ์
๋ ฅ ๋" << endl;
while (true)
{
cout << "์ผ์ด >>";
cin >> jpn;
if(jpn == "ใใใ")
break;
cout << "ํ๊ธ >>";
cin >> kor;
Word temp(jpn, kor);
v.push_back(temp);
}
}
else if(num == 2)
{
int n, ans, pos;
cout << "์ผ์ด ์ดํ ํ
์คํธ๋ฅผ ์์ํฉ๋๋ค. 1 ~ 4 ์ธ ๋ค๋ฅธ ์
๋ ฅ์ ์ข
๋ฃ.";
while (true)
{
Word temp;
for(int i = 0; i < 4; i++)
{
words[i] = temp;
}
ans = dist(gen) % v.size();
cout << v[ans].getJpn() << "?" <<endl;
pos = dist(gen) % 4;
words[pos] = v[ans];
int cnt = 1;
while (cnt < 4)
{
n = dist(gen) % v.size();
for(int i = 0; i < 4; i++)
{
if(v[n].getJpn() == words[i].getJpn())
break;
if(i == 3)
{
for(int j = 0; j < 4; j++)
{
if(words[j].getJpn() == words[j].getKor())
{
words[j] = v[n];
cnt++;
break;
}
}
}
}
}
for(int i = 0; i < 4; i++)
{
cout << "(" << i + 1 << ") " << words[i].getKor() << " ";
}
int result = 0;
cout << ":>>";
cin >> result;
if(1 <= result && result <= 4)
{
if(result - 1 == pos)
cout << "Excellent !!" << endl;
else
{
cout << "No. !!" << endl;
}
}
else
{
break;
}
}
}
else
break;
cout << endl;
}
}
ย
_์ค์ต ๋ฌธ์ 10 - 13
๋ฌธ์ : map์ปจํ
์ด๋ ์ด์ฉํด์ ์ฑ์ ์กฐํ ํ๋ก๊ทธ๋จ ๋ง๋ค๊ธฐ
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<string, int> student;
int num;
int score;
string name;
cout << "***** ์ ์๊ด๋ฆฌ ํ๋ก๊ทธ๋จ HIGH SCORE์ ์์ํฉ๋๋ค *****" << endl;
while(true)
{
cout << "์
๋ ฅ:1, ์กฐํ:2, ์ข
๋ฃ:3 >> ";
cin >> num;
if(num == 3)
{
cout << "ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํฉ๋๋ค..." << endl;
break;
}
if(num == 1)
{
cout << "์ด๋ฆ๊ณผ ์ ์>> ";
cin >> name >> score;
student[name] = score;
}
if(num == 2)
{
cout << "์ด๋ฆ>> ";
cin >> name;
cout << name << "์ ์ ์๋ " << student[name] << endl;
}
}
}
ย
_์ค์ต ๋ฌธ์ 10 - 14
๋ฌธ์ : ์ํธ ๊ด๋ฆฌ ์์ฉํ๋ก๊ทธ๋จ์ map์ ์ด์ํด ๋ง๋ค๊ธฐ
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<string, string> student;
int num;
string key;
string name;
cout << "***** ์ํธ๊ด๋ฆฌ ํ๋ก๊ทธ๋จ WHO๋ฅผ ์์ํฉ๋๋ค *****" << endl;
while(true)
{
cout << "์ฝ์
:1, ๊ฒ์ฌ:2, ์ข
๋ฃ:3 >> ";
cin >> num;
if(num == 3)
{
cout << "ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํฉ๋๋ค..." << endl;
break;
}
if(num == 1)
{
cout << "์ด๋ฆ ์ํธ>> ";
cin >> name >> key;
student[name] = key;
}
if(num == 2)
{
cout << "์ด๋ฆ? ";
cin >> name;
while(true){
cout << "์ํธ? ";
cin >> key;
if(student[name] == key){
cout << "ํต๊ณผ!!" << endl;
break;
}
else
cout << "์คํจ~~" << endl;
}
}
}
}
ย
_์ค์ต ๋ฌธ์ 10 - 15
๋ฌธ์ : vector๋ฅผ ์ด์ฉํด Circleํด๋์ค ์ฝ์
์ญ์ ํ๋ ํ๋ก๊ทธ๋จ ๋ง๋ค๊ธฐ
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Circle{
string name;
int radius;
public:
Circle(int radius, string name)
{
this->radius = radius;
this->name = name;
}
double getArea(){ return 3.14 * radius * radius; }
string getName(){ return name; }
};
int main()
{
vector<Circle*> v;
vector<Circle*>::iterator it;
string name;
int radius;
int num;
cout << "์์ ์ฝ์
ํ๊ณ ์ญ์ ํ๋ ํ๋ก๊ทธ๋จ์
๋๋ค." << endl;
while (true){
cout <<"์ฝ์
:1, ์ญ์ :2, ๋ชจ๋๋ณด๊ธฐ:3, ์ข
๋ฃ:4 >> ";
cin >> num;
if(num == 4)
break;
if(num == 1)
{
cout << "์์ฑํ๊ณ ์ ํ๋ ์์ ๋ฐ์ง๋ฆ๊ณผ ์ด๋ฆ์ >> ";
cin >> radius >> name;
v.push_back(new Circle(radius, name));
}
if(num == 2)
{
cout << "์ญ์ ํ๊ณ ์ ํ๋ ์์ ์ด๋ฆ์ >> ";
cin >> name;
it = v.begin();
while(it != v.end())
{
Circle *temp = *it;
if(temp->getName() == name) {
it = v.erase(it);
}
else
it++;
}
}
if(num == 3)
{
for(it = v.begin(); it != v.end(); it++)
{
Circle *temp = *it;
cout << temp->getName() << endl;
}
cout << endl;
}
}
}
ย
_์ค์ต ๋ฌธ์ 10 - 16
๋ฌธ์ : vector<Shape*>v; ๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๋จํ ๊ทธ๋ํฝ ํธ์ง๊ธฐ๋ฅผ ์ฝ์ ๋ฐฉํ์ผ๋ก ๋ง๋ค๊ธฐ
โ ๏ธShape, Circle, Rect, Line ํด๋์ค์ ํด๋นํ๋ cppํ์ผ๊ณผ ํค๋ํ์ผ์ ์ฑ
์ ๋์์๋๋๋ก ์์ฑ
#include <iostream>
#include <string>
#include <vector>
#include "Shape.h"
#include "Circle.h"
#include "Rect.h"
#include "Line.h"
using namespace std;
int main()
{
vector<Shape*> v;
vector<Shape*>::iterator it;
int num;
int sNum;
cout << "๊ทธ๋ํฝ ์๋ํฐ์
๋๋ค." << endl;
while (true)
{
cout << "์ฝ์
:1, ์ญ์ :2, ๋ชจ๋๋ณด๊ธฐ:3, ์ข
๋ฃ:4 >> ";
cin >> num;
if(num == 4)
break;
if(num == 1)
{
cout << "์ :1, ์:2, ์ฌ๊ฐํ:3 >> ";
cin >> sNum;
if(sNum == 1)
{
v.push_back(new Line);
}
if(sNum == 2)
{
v.push_back(new Circle);
}
if(sNum == 3)
{
v.push_back(new Rect);
}
}
if(num == 2)
{
cout << "์ญ์ ํ๊ณ ์ ํ๋ ๋ํ์ ์ธ๋ฑ์ค >> ";
cin >> sNum;
it = v.begin();
int i = 0;
while(it != v.end())
{
if(i == sNum)
{
it = v.erase(it);
break;
}
else
{
it++;
i++;
}
}
}
if(num == 3)
{
int i;
for(it = v.begin(), i = 0; it != v.end(); it++, i++)
{
Shape *temp = *it;
cout << i << ": ";
temp->paint();
}
}
}
}
ย
11์ฅ๋ถํฐ๋ ์ด๋ป๊ฒ ๋ณผ ์ ์๋์ ??