1

文字列とintで構成される構造体のリストを調べようとしています。文字列は URL を構成する単なる行であり、いくつかの URL の重複があります。それらはアルファベット順に並べられているため、すべての重複が隣り合っています。int は、特定の URL のコピー数をカウントするために使用されるカウンターです。私がする必要があるのは、各 URL の 1 つのインスタンスだけを出力し、その URL の最初のインスタンスが配列内にいくつあったかを示すことです。私が理解しようとしているのは、各 URL の 1 つのインスタンスを除くすべてを削除する方法です。誰かがこれを行う手法を知っているかどうか疑問に思っていました。

プログラムのこの特定の部分について、これまでに持っているコードを次に示します。

 void histogram(const int MaxPages, istream& input, ostream& output)
{


    string temp;
    int current = 0;
    CountedLocation *dynamicArray = new CountedLocation[MaxPages];
    int toBeMoved = current - 1;

    getline(input, temp);

    while(!input.eof())
    {

        temp = extractTheRequest(temp);
        toBeMoved = current-1;
        dynamicArray[current].locator = temp;
        if(isAGet(temp))
        {

            temp = extractLocator(temp);
            while (toBeMoved >= 0 && temp < dynamicArray[toBeMoved].locator)
            {
                dynamicArray[toBeMoved+1].locator = dynamicArray[toBeMoved].locator;
                dynamicArray[toBeMoved+1].counter = 1;
                --toBeMoved;
            }
            dynamicArray[toBeMoved+1].locator = temp;
            dynamicArray[toBeMoved+1].counter = 1;
        }

        current++;
        getline(input, temp);

    }
    for(int i=0; i < MaxPages; i++)
    {
        string temp = dynamicArray[i].locator;
        temp = "\"" + temp + "\"";

        dynamicArray[i].locator = temp;
    }
    //int tempMax = MaxPages;
    for(int i=0; i < current; i++)
    {
        if(search(dynamicArray, MaxPages, dynamicArray[i].locator) == search(dynamicArray, MaxPages, dynamicArray[i+1].locator))
        {
            int toBeMoved = i;
            dynamicArray[i+1].counter = dynamicArray[i].counter + 1;
            while (toBeMoved < current-1)
            {
                dynamicArray[toBeMoved] = dynamicArray[toBeMoved+1];
                ++toBeMoved;
            }
            --current;
            if(search(dynamicArray, MaxPages, dynamicArray[i].locator) == search(dynamicArray, MaxPages, dynamicArray[i+1].locator))
                continue;

       }
    }

    for(int i=0; i < current+1; i++)
    {
        cerr << dynamicArray[i].locator<< ", " << dynamicArray[i].counter << endl;
        output << dynamicArray[i].locator<< ", " << dynamicArray[i].counter << endl;
    }
  delete [] dynamicArray;

}
4

2 に答える 2

2

新しいvector構造を作成します。ストリームの最初から開始します。ストリームを繰り返し処理し、現在の文字列が の最後の要素の文字列と異なる場合、その文字vector列に初期化された要素を の後ろにプッシュしvector、カウンターを 1 に設定します。vectorそれ以外の場合は、最後の要素に関連付けられたカウンターをインクリメントします。ストリーム内の次の文字列に移動します。入力文字列が既に並べ替えられた文字列で本当に構成されていると仮定すると、最後に、vector出現回数を含む一意の文字列が含まれます。

テストされていない疑似的なコードでは:

std::vector<MyStruct> love_to_count (istream &input) {
    std::string url;
    std::vector<MyStruct> v;
    if (! (input >> url)) return v;
    v.push_back(MyStruct(url, 1));
    while (input >> url) {
        if (url != v.back().url) {
            v.push_back(MyStruct(url, 1));
        } else {
            v.back().count += 1;
        }
    }
    return v;
}
于 2013-10-24T00:08:25.113 に答える
1

あなたが絶対的な最大速度を切望していない限り、私はstd::map.

std::map<std::string, int> URLs;

URL とカウントを読み取ります。URL をインデックスとして使用し、カウントを追加します。

URLs[URL] += count;

それらをすべて読んだら、結果を書き出すことができます。

for (auto const &u : URLs)
    std::cout << u.first << "\t" << u.second << "\n";

代わりにa を使用してこれを行うことは可能ですvectorが、より多くの作業が必要であり、ファイルからデータを読み取る場合、速度の違いは無視できる可能性があります (処理に費やされる時間は、I/O 時間に比べてマイナー ノイズになります) )

于 2013-10-24T00:13:59.550 に答える