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(cout, " ") を知って気に入った
ということは思い出した。
あと,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)
Andrew Koenig Barbara E. Moo
Addison-Wesley Professional
売り上げランキング: 95265