Accelerated C++ Chapter06
どもです。
Accelerated C++ メモとかをぼちぼち再開していこかなと。
よい復習になるだろうしね。
そうそう,C++ な人は,毎回 「std::」を書くのだろうかと
疑問に思ってしまった。using を使わない方がお行儀がいいことは
わかるが,面倒くさい気が・・・・。
メモ
- この章の目的は,思うに,ライブラリの使い方を覚えましょ的な。
- イテレータと添え字
std::vectro<int>::iterator iter = vec.begin(); iter[1] = 7;
とかできる。ポインタの typedef だから出来るのか。
旨味は分からん。
- remove_copy, remove_copy_if, remove_if
こいつらの,「remove」 は,pred なり,val なりに対してのものだと覚えよう。
Exercises
以前書いたものだから,あまり記憶にないが,おそらく大丈夫だろう。
ファミ通の攻略本だし。えっ?
この頃,ostream_iterator
ということは思い出した。
あと,std:: があったりなかったり,統一されてませんねぇ。
Exercise 6-1
vector<string> frame(const vector<string>& v) { vector<string> ret; string::size_type maxlen = width(v); string border(maxlen + 4, '*'); ret.push_back(border); for (vector<string>::const_iterator iter = v.begin(); iter != v.end(); ++iter) { ret.push_back("* " + *iter + string(maxlen - iter->size(), ' ') + " *"); } ret.push_back(border); return ret; } vector<string> hcat(const vector<string>& left, const vector<string>& right) { vector<string> ret; string::size_type width1 = width(left) + 1; vector<string>::const_iterator liter = left.begin(), riter = right.begin(); vector<string>::const_iterator lenditer = left.end(), renditer = right.end(); while (liter != lenditer || riter != renditer) { string s; if (liter != lenditer) { s = *liter++; } s += string(width1 - s.size(), ' '); if (riter != renditer) { s += *riter++; } ret.push_back(s); } return ret; }
Exercise 6-3, 6-4
#include <iostream> #include <vector> #include <iterator> using namespace std; int main() { vector<int> u(10, 100); vector<int> v; // The following causes segmentation fault // copy(u.begin(), u.end(), v.begin()); // One solution copy(u.begin(), u.end(), back_inserter(v)); // Another solution vector<int> v2(u.size()); copy(u.begin(), u.end(), v2.begin()); cout << "v: "; copy(v.begin(), v.end(), ostream_iterator<int>(cout, " ")); cout << endl; cout << "v2: "; copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " ")); cout << endl; return 0; }
Exercise 6-5
double optimistic_median(const Student_info& s) { vector<double> nonzero; remove_copy(s.homework.begin(), s.homework.end(), back_inserter(nonzero), 0); if (nonzero.empty()) { return grade(s.midterm, s.final, 0); } return grade(s.midterm, s.final, median(nonzero)); }
Exercise 6-6
double analysis(const std::vector<Student_info>& students, double grade_func(const Student_info&)) { vector<double> grades; transform(students.begin(), students.end(), back_inserter(grades), grade_func); return median(grades); }
Exercise 6-7
bool didhw(const Student_info& s) { return !s.homework.empty(); } vector<Student_info> extract_didnts(vector<Student_info>& students) { vector<Student_info>::iterator it = stable_partition(students.begin(), students.end(), didhw); vector<Student_info> didnt(it, students.end()); students.erase(it, students.end()); return students; }
Exercise 6-9
#include <iostream> #include <algorithm> #include <vector> #include <string> #include <iterator> #include <numeric> using namespace std; int main() { vector<string> vec(10, "foo"); copy(vec.begin(), vec.end(), ostream_iterator<string>(cout, " ")); cout << endl; string s = accumulate(vec.begin(), vec.end(), string("")); cout << s << endl; return 0; }
Accelerated C++: Practical Programming by Example (C++ In-Depth Series)
posted with amazlet at 11.03.11
Andrew Koenig Barbara E. Moo
Addison-Wesley Professional
売り上げランキング: 95265
Addison-Wesley Professional
売り上げランキング: 95265