C++第3版 16章 練習問題解答

目次へ戻る

16.1

#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
using namespace std;

namespace exam {
    vector<char>    vc;
    void print()
        {copy(vc.begin(),vc.end(),ostream_iterator<char>(cout));}
    void rprint()
        {copy(vc.rbegin(),vc.rend(),ostream_iterator<char>(cout));}
    void push(char c)
        {vc.insert(find_if(vc.begin(),vc.end(),
        bind2nd(greater<char>(),c)),c);}
}

int main(int argc,char** argv)
{
    exam::push('c');
    exam::push('a');
    exam::push('t');
    exam::push('x');
    exam::push('i');
    exam::push('s');
    exam::print();  cout << endl;
    exam::rprint(); cout << endl;
}

16.2

#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
using namespace std;
#pragma warning(disable : 4786)

int main(int argc,char** argv)
{
    vector<string>  vs;
    string          s;
    while (cin >> s) vs.push_back(s);
    sort(vs.begin(),vs.end());
    copy(vs.begin(),vs.end(),ostream_iterator<string>(cout," "));
    cout << endl;
}

16.3

#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
using namespace std;
#pragma warning(disable : 4786)

typedef vector<string>::iterator vsiter;
bool InitLess(const string& s,const string& t)
    {return s[0] < t[0];}

int main(int argc,char** argv)
{
    vector<string>  vs;
    string          s;
    while (cin >> s) vs.push_back(s);
    sort(vs.begin(),vs.end());
    pair<vsiter,vsiter> it = equal_range(vs.begin(),vs.end(),"a",InitLess);
    copy(it.first,it.second,ostream_iterator<string>(cout," "));
    cout << endl;
}

16.4

前問の答えの最後の2行を次のように直す。
    vs.erase(it.first,it.second);
    copy(vs.begin(),vs.end(),ostream_iterator<string>(cout," "));
    cout << endl;

16.5

IsKankitu の中は適当に設定する。
#include <string>
#include <vector>
#include <set>
#include <algorithm>
#include <functional>
#include <iostream>
using namespace std;
#pragma warning(disable : 4786)

bool IsKankitu(const string& s)
{
    static set<string>  tbl;
    bool                bFirst = true;
    if (bFirst) {
        bFirst = false;
        tbl.insert("lemon");
        tbl.insert("orange");
    }
    return tbl.find(s) != tbl.end();
}

int main(int argc,char** argv)
{
    vector<string>  vs;
    string          s;
    while (cin >> s) vs.push_back(s);
    vs.erase(remove_if(vs.begin(),vs.end(),IsKankitu),vs.end());
    copy(vs.begin(),vs.end(),ostream_iterator<string>(cout," "));
    cout << endl;
}

16.6

前問の IsKankitu の代わりに嫌いなものを判断する関数を書けばよい。

16.7

パス。

16.8

パス。

16.9

パス。

16.10

パス。

16.11

パス。

16.12

パス。

16.13

パス。

16.14

パス。

16.15

insert を行ったときに拡張が起きない(capacity() > size())ならば、 sizeが増えて、end() も伸びるので、反復子をインクリメントしても終わることはない。 従って、そのうち拡張が起きる。そうすると次の反復子は無効になり、次の insert でおかしくなる。
前章目次次章