AcceleratedC++/Chapter4 | AcceleratedC++/Chapter6 |
Contents |
1. Chapter 5 Using sequential containers and analyzing strings ¶
- ์ฌํ๊น์ง vector๋ string ๊ฐ๊ณ ์ ๋์๋ค. ์ด์ ์ด๊ฒ๋ค์ ๋์ด์๋ ๊ฒ์ ์ดํด๋ณผ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ๋ฒ์ ๋ํด ๋ ๊น๊ฒ ์ดํดํ๊ฒ ๋ ๊ฒ์ด๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ฃ๊ตฌ์กฐ?ํจ์๋ง์ ์ ๊ณตํด์ฃผ๋ ๊ฒ์ด ์๋๋ค. ํผํผํ ์ํคํ
์ณ๋ ๋ฐ์ํด์ค๋ค. ๋ง์น vector์ ์ฌ์ฉ๋ฒ์ ์๊ฒ ๋๋ฉด, ๋ค๋ฅธ๊ฒ๋ ์ฝ๊ฒ ๋ฐฐ์ธ์ ์๋๊ฒ์ฒ๋ผ...
1.1. 5.1 Separating students into categories ¶
~cpp bool fgrade(const Student_info& s) { return grade(s) < 60; } vector<Student_info> extract_fails(vector<Student_info>& students) { vector<Student_info> pass, fail; for(vector<Student_info>::size_type i = 0; i != students.size() ; ++i) { if(fgrade(students[i])) fail.push_back(students[i]); else pass.push_back(students[i]); } students = pass; return fail; }
1.1.1. 5.1.1 Erasing elements in place ¶
~cpp vector<Student_info> extract_fails(vector<Student_info>& students) { vector<Student_info> fail; vector<Student_info>::size_type i = 0 while(i != students.size()) { if(fgrade(students[i])) { fail.push_back(students[i]); students.erase(students.begin() + i); } else ++i; } return fail; }
- ์ students.erase(studentsi) ํ์ง ์๋๊ฐ? ๋ชจ๋ ์ปจํ
์ด๋์ ์ผ๊ด์ฑ์ ์ ๊ณตํ๊ธฐ ์ํด์๋ผ๊ณ ํ๋ค. ๋ฐ๋ก ๋ฐ๋ณต์๋ผ ๋ถ๋ฆฌ์ฐ๋ ๊ฒ์ ์ด์ฉํด, (ํฌ์ธํฐ๋ณด๋ค ๋ฐ๋ณต์๊ฐ ๋จผ์ ๋์ค๋ค์.) ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ์ ์ด๋ฅผ ํ ์ ์๋ ๊ฒ์ด๋ค.
- ๊ทธ๋ฆผ ๋ณด๋ฉด ์๊ฒ ์ง๋ง, ๋ณต์ฌ ๊ฒ๋๊ฒ ํด๋๋ค. ํ๋ ์ง์ธ๋๋ง๋ค ๊ทธ ๋ค์ ์๋๊ฑธ ๋ค ๋ณต์ฌํ๋ ๊ฒ์ด๋ค. ๋ง์ฝ์ ๋ชจ๋ fail์ด๋ผ๋ฉด? ๋์ฐํ๋ค.
- ๋ํ, ์ง์์ค์ผ๋ก์จ ์ปจํ
์ด๋์ ์ฌ์ด์ฆ๊ฐ ๋ณํ๋ค. ์ฆ ๋ชจ๋ ํ์์ ๋ค ๊ฒ์ฌํ์ง ๋ชปํ ์๋ ์๋ค. ๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊ฟ์ฃผ์ด์ผ ํ๋ค.
~cpp vector<Student_info> extract_fails(vector<Student_info>& students) { vector<Student_info> fail; vector<Student_info>::size_type i = 0; vector<Student_info>::size_type size = students.size(); while(i != size) { if(fgrade(students[i])) { fail.push_back(students[i]); students.erase(students.begin() + i); } else ++i; } return fail; }
1.1.2. 5.1.2 Sequential versus random access ¶
- ์์ ๋ฒกํฐ๋ ์์ ์ ๊ทผ์ด ํ์ํ์ง ์๋ค. ๊ทธ๋ฅ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํ ๋ฟ์ด๋ค. ์์์ ๊ทผ์ ํฌ๊ธฐํจ์ผ๋ก์จ ์๊ธฐ๋ ์ฌ๋ฌ๊ฐ์ง ์ด๋์ด ์๋ ์ปจํ
์ด๋๊ฐ ์์ ๊ฒ์ด๋ค. ๊ทธ๋ณด๋ค ๋จผ์ ์ปจํ
์ด๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ ์ดํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฐ๋ณต์๋ผ๋ ๊ฒ์ ๋จผ์ ์ดํด๋ณด์.
1.2. 5.2 Iterators ¶
- ์ปจํ
์ด๋์ ์ปจํ
์ด๋ ์์ ์์๋ฅผ ํ์ธ
- ๊ทธ ์์ ์์ ์ ์ฅ๋์ด ์๋ ๊ฐ ํ์ธ
- ์ปจํ
์ด๋ ์์ ์์๋ค ์ฌ์ด๋ฅผ ์๋ค๊ฐ๋ค ํ ์ ์๋ ๊ธฐ๋ฅ
- ์ปจํ
์ด๋๊ฐ ํจ๊ณผ์ ์ผ๋ก ๋ค๋ฃฐ์ ์๋ ์ฐ์ฐ๋ง์ ๊ฐ์ง๊ณ ๋๋๋ก ์ ํํ๋ ๊ธฐ๋ฅ
~cpp for(vector<Student_info>::size_type i = 0 ; i != students.size() ; ++i) cout << students[i].name << endl;
~cpp for(vector<Student_info>::const_iterator i = students.begin() ; i != students.end() ; ++i) cout << (*i).name << endl;
1.2.1. 5.2.1 Iterator types ¶
- const_iterator : ๊ฐ์ ๋ณ๊ฒฝ์ํค์ง ์๊ณ ์ํํ ๋
- iterator : ๊ทธ๋ฅ ์ํํ ๋
1.2.2. 5.2.2 Iterator Operations ¶
1.2.4. 5.2.4 The meaning of students.erase(students.begin() + i) ¶
1.3. 5.3 Using iterators instead of indices ¶
~cpp vector<Students_Info> extract_fails(vector<Student_info>& students) { vector<Student_info> fail; vector<Student_info>::iterator iter = students.begin(); while(iter != students.end()) { if(fgrade(*iter)) { fail.push_back(*iter); iter = students.erase(iter); } else ++iter; } return fail; }
~cpp while(iter != students.end()) /*...*/
~cpp vector<Student_info>::iterator iter = students.begin(). end_iter = students.end(); while(iter != end_iter) /*...*/
1.4. 5.4 Ranking our data structure for better performance ¶
1.5. 5.5 The list type ¶
1.5.1. 5.5.1 Some important differences ¶
~cpp students.sort(compare);
1.6. 5.6 Taking strings apart ¶
1.7. 5.7, 5.8 ¶
~cpp for(vector<string>::const_iterator i = bottom.begin(); i != bottom.end(); ++i) ret.push_back(*it);
~cpp ret.insert(ret.end(), bottom.begin(), bottom.end());