http://cafe.naver.com/cafec/1042
알고리즘과 container 들어가기 전에 샘플 프로그램 하나 보고 넘어가죠.
아래 프로그램은 vector<string> p 를 가지고 frame, vertical , horizontal로
텍스트 그림을 그리는 것입니다.
처음 vector<string> p 에 push_back()으로 요소를 넣어 줍니다.
frame은 Text의 최대 길이를 구하여 외곽으로 Frame을 '*' 로 해줍니다.
vcat은 두개의 vector<string>을 받아 종으로 붙은 vector<string>을 만듭니다.
hcat은 두개의 vector<string>을 받아 횡으로 붙은 vector<string>을 만듭니다.
vcat은 간다하게 붙이면 되지만 hcat의 경우 한 쪽의 요소가 적을 경우 빈곳을
whitespace를 넣어 채워 줍니다.
gcc 3.2 , ms visual c++ 6.0 sp5 이상에서 compile 하시는 것이 좋습니다.
첨부한 프로그램을 실행해 보시고 source를 보세요.
C로 구현해 봐도 재미있을 것 같네요..
그럼 다음 연재에서 generic algorithm 보도록 하죠 ... ^^/
ps)gcc에는 min/max를 지원하지만 vc sp5에서는 지원이 안되서 template으로 따로 만들었습니다.
1 #include <iostream> 2 #include <iterator> 3 #include <algorithm> 4 #include <string> 5 #include <vector> 6 7 using namespace std; 8 9 void title(string); //title printer 10 void PrnCnt(string , const vector<string> ); //vector picture print 11 void nextfn(); //to continue ... 12 13 //max length return in vector<string> 14 string::size_type width(const vector<string>& v); 15 //frame text picture inserts vector 16 vector<string> frame(const vector<string>& v); 17 //vertical text picture inserts vector<string> 18 vector<string> vcat(const vector<string>& top, 19 const vector<string>& bottom); 20 //horizontal text picture inserts vector<string> 21 vector<string> hcat(const vector<string>& left, 22 const vector<string>& right); 23 24 #ifdef _MSC_VER 25 template <class T> T max(const T& a, const T& b) {return (a > b)?a:b;} 26 template <class T> T min(const T& a, const T& b) {return (a < b)?a:b;} 27 #endif 28 29 int main() 30 { 31 vector<string> p; 32 p.push_back("this is an"); 33 p.push_back("example"); 34 p.push_back("to"); 35 p.push_back("illustrate"); 36 p.push_back("framing"); 37 38 #ifdef _MSC_VER 39 system("cls"); 40 #else 41 system("clear"); 42 #endif 43 44 //Original vector<string> p prints to standard out 45 PrnCnt("Original vector<string> p",p); 46 //Change From Original string to Frame 47 PrnCnt("Frame text picture",frame(p)); 48 //Vertical text picture vector<string> v prints to standard out 49 PrnCnt("Vertical text picture(p, frame(p))",vcat(p, frame(p))); 50 //Vertical text picture vector<string> v1 prints to standard out 51 PrnCnt("Vertical text picture(frame(p), p)",vcat(frame(p),p)); 52 //Horizontal text picture vector<string> h prints to standard out 53 PrnCnt("Horizontal text picture(p, frame(p))",hcat(p,frame(p))); 54 //Horizontal text picture vector<string> h1 prints to standard out 55 PrnCnt("Horizontal text picture(frame(p), p)",hcat(frame(p),p)); 56 57 return 0; 58 } 59 60 void title(string t_name) 61 { 62 string line(t_name.size()+2,'-'); 63 cout << line << endl; 64 cout << ' ' << t_name << endl; 65 cout << line << endl; 66 } 67 68 void PrnCnt(string s, const vector<string> d) 69 { 70 title(s); 71 ostream_iterator<string> ofile(cout, "\n"); 72 copy(d.begin(), d.end(), ofile); 73 cout << endl; 74 nextfn(); 75 } 76 77 void nextfn() 78 { 79 cin.clear(); 80 cout << "Press any key to continue..."; 81 cin.get(); 82 #ifdef _MSC_VER 83 system("cls"); 84 #else 85 system("clear"); 86 #endif 87 } 88 89 string::size_type width(const vector<string>& v) 90 { 91 string::size_type maxlen = 0; 92 for(vector<string>::size_type i = 0; i != v.size(); ++i) 93 maxlen = max(maxlen, v[i].size()); 94 return maxlen; 95 } 96 97 vector<string> frame(const vector<string>& v) 98 { 99 vector<string> ret; 100 string::size_type maxlen = width(v); 101 string border(maxlen + 4, '*'); 102 // write the top border 103 ret.push_back(border); 104 // write each interior row, bordered by an asterisk and a space 105 for (vector<string>::size_type i = 0; i != v.size(); ++i) { 106 ret.push_back("* "+v[i]+string(maxlen-v[i].size(),' ')+" *"); 107 } 108 // write the bottom border 109 ret.push_back(border); 110 return ret; 111 } 112 113 vector<string> vcat(const vector<string>& top, const vector<string>& bottom) 114 { 115 // copy the `top' picture 116 vector<string> ret = top; 117 // copy entire `bottom' picture 118 for (vector<string>::const_iterator it = bottom.begin();it != bottom.end(); ++it) 119 ret.push_back(*it); 120 121 return ret; 122 } 123 124 vector<string> hcat(const vector<string>& left, const vector<string>& right) 125 { 126 vector<string> ret; 127 128 // add 1 to leave a space between pictures 129 string::size_type width1 = width(left) + 1; 130 // indices to look at elements from `left' and `right' respectively 131 vector<string>::size_type i = 0, j = 0; 132 // continue until we've seen all rows from both pictures 133 while (i != left.size() || j != right.size()) { 134 // construct new `string' to hold characters from both pictures 135 string s; 136 // copy a row from the left-hand side, if there is one 137 if (i != left.size()) 138 s = left[i++]; 139 // pad to full width 140 s += string(width1 - s.size(), ' '); 141 // copy a row from the right-hand side, if there is one 142 if (j != right.size()) 143 s += right[j++]; 144 // add `s' to the picture we're creating 145 ret.push_back(s); 146 } 147 return ret; 148 } 149 |
'C C++ - STL' 카테고리의 다른 글
STL - 8 Vector 라이브러리 (0) | 2014.02.13 |
---|---|
STL - 7 Sequence Container (0) | 2014.02.13 |
STL - 6 알고리즘 (0) | 2014.02.13 |
STL - 4 Iterator 반복자 (0) | 2014.02.13 |
STL - 3 템플릿에 대하여 (0) | 2014.02.13 |