0

ランダムな文字列を入力として受け取るアルゴリズムを書いています。発生した最大長と、その特定の長さの単語数を出力する必要があります。はい、別のアプローチを使用できることはわかっていますが、各文字列を av[it's length] に格納することを考えていました。同じ長さの文字列が複数ある場合は、u[same length] をインクリメントしてから、それらの値を出力します。v[length] がすでに設定されているかどうかを確認するにはどうすればよいですか?

悪い英語で申し訳ありません。

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

using namespace std;

typedef unsigned short us;
typedef vector<string> vstr;
typedef vector<us> vus;

int main()
{
    string str;
    vstr v;
    vus u(50, 1);
    us len;

    while (cin >> str && str != "0")
    {
        len = str.length();

        //if there is an element set at v[len] then ++u[len] otherwise v[len] = str;
    }

    //bunch of other code

    return 0;
}
4

3 に答える 3

3

はい、別のアプローチを使用できることを知っています

正直なところ、別のアプローチをとったほうがいいと思います。

長さのベクトルもマップもまったく必要ありません。また、文字列も表示する必要がない限り、文字列のベクトルも必要ありません (ここでは、必要があると仮定します)。最後に、これらの文字列の最大長を知る必要さえありません。

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

int main()
{
    std::vector<std::string> words;

    std::string::size_type maxLength = 0;
    std::string str;
    while (std::cin >> str)
    {
        auto len = str.length();
        if (len == maxLength)
        {
            words.push_back(str);
        }
        else if (len > maxLength)
        {
            maxLength = len;

            words.clear();
            words.push_back(str);
        }
    }

    std::cout << "Max length: " << maxLength << std::endl;
    std::cout << "# of words with max length: " << words.size() << std::endl;
    std::cout << "Words with max length: " << std::endl;
    for (auto const& s : words) { std::cout << s << std::endl; }

    return 0;
}
于 2013-03-10T21:38:46.920 に答える
3

可能な文字列の最大長を事前に知っていない限り、これは機能しません。この最大値を X と呼びましょう。次に、0 に初期化された X 整数のベクトルを作成し、添字演算子を使用して必要なベクトルをインクリメントするだけです。

std::vector<int> counts(X, 0); // X ints, initialized to 0
for (const string str : v) {
    int length = str.size();
    try {
        counts.at(length)++;
    } catch (const std::out_of_range& oor) {
        // Your professor lied to you!
    }
}

この問題にアプローチする方法は、map. 次に、次のことを実行できます。

std::map<int, int> counts;
for (const string str : v) {
    int length = str.size();
    ++counts[length];
}

counts[length] は、要素がまだ存在しない場合は [length] に要素を作成し、既に存在する場合はインクリメントします。

于 2013-03-10T21:28:58.363 に答える
0

Astd::vector vの長さは で与えられv.size()、範囲内のすべての要素が[0,v.size())存在します。

したがって、要素はv[n]ifに存在しますv.size() > n

要素が存在しない場合 (つまり、長さが少なくとも ではない場合)に関数が例外をスローするため、ベクトルの長さをチェックするか、v.at(n)代わりに で要素にアクセスすることでテストできます。v[n]at()n

std::vectoraがその長さまでのすべてのインデックスに要素を含むという事実は、疎配列の効率的な表現ではないことを意味します 標準コンテナの 1 つで疎配列を表現するにはstd::map、要素が連続している必要がないため、使用する方が適切ですキー。

于 2013-03-10T21:37:36.287 に答える