読者です 読者をやめる 読者になる 読者になる

Accelerated C++ 第3章 課題残り

C++ Accelerated C++
3-3

vectorを2個使用して、単語そのものと、出現回数用の2個vectorを使う。でも連想配列(map)を使うのが素直。まだ出てきてないですが。

#include <iostream>
#include <string>
#include <vector>

using std::cin;     using std::cout;    using std::endl;
using std::vector;  using std::string;

int main()
{
    vector<string>  vwords;
    vector<int>     vcounts;
    string word;
    
    while (cin >> word) {
        bool found = false;
        for (int i = 0; i < vwords.size(); ++i) {
            if (vwords[i] == word) {
                 ++vcounts[i];
                found = true;
                break;
            }
        }
        if (!found) {
            vwords.push_back(word);
            vcounts.push_back(1);
        }
    }

    for (int i = 0; i < vwords.size(); ++i) {
        cout << vwords[i] << ": " << vcounts[i] << endl;
    }
    return 0;
}

登録済みかどうかで、さらっと == で比較しているけど、オブジェクト同士の比較なので、本当は同一判定なのか、同値判定なのかが大切。
実際にやってみると、==は同値判定でした。

#include <iostream>
#include <string>

using std::cout;        using std::endl;
using std::string;

int main()
{
    string  s1 = "abc";
    string  s2 = "abc";
    string  s3 = "a";

    cout    << "s1 == s2\t"
            << ((s1 == s2)? "true": "false") << endl;
    cout    << "s1 == \"abc\"\t"
            << ((s1 == "abc")? "true": "false") << endl;
    cout    << "s1 == s3 + \"bc\"\t"
            << ((s1 == s3 + "bc")? "true": "false") << endl;
    cout    << "s1 == string(\"ab\") + \"c\"\t"
            << ((s1 == string("ab") + "c")? "true": "false") << endl;
    return 0;
}
3-4

最初に1単語入力して・・というのが素直かとも思うけど、string::size_typeが符号なしということなので、最小値の初期値を -1 で初期化してみた。

#include <iostream>
#include <string>

using std::cin;     using std::cout;    using std::endl;     using std::string;

int main()
{

    string::size_type   min = -1;
    string::size_type   max = 0;
    
    string word;
    while (cin >> word) {
        if (word.size() < min) {
            min = word.size();
        }
        if (word.size() > max) {
            max = word.size();
        }
    }
    cout << "min = " << min << endl;
    cout << "max = " << max << endl;
    
    return 0;
}
3-5

さすがに面倒になってきたので省略。
宿題の数が最初からわかっている・・というのは1人分の入力でEOFとしたあと、cinから入力できなくなるためと思われ。$4.1.3のclear()を使えば回避可能。