0

以前に見たことのないエラーが発生しました。これは、物事への参照があいまいであることを示しています。

実行中の中央値を計算する小さなテスト プログラムを作成しています。リストが大きくなるにつれて、中央値が再計算されます。この場合、中央値はリストの中央の数字 (または上中央) を意味します。したがって、7 の中央値は 7、7 と 9 の中央値は 9、7 3 と 9 の中央値は 7 です。

私はこれを2つの動的配列で達成しています(願っています)。最初に、最初の値が中央値として設定され、入力された各数値が現在の中央値と比較されます。中央値は、2 つの配列間の中間要素を計算するために取得されます。

左の配列は中央値よりも小さいすべての値を表し、右の配列はそれより大きいすべての値を表します。挿入ソートを使用して、各配列の数値を並べ替えます (ほぼソートされたリストに最適です)。

発生しているエラーやどこが間違っているのか理解できません。私は C++ にかなり慣れていないので、この問題に対するより単純なアプローチを選択しました。

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

using namespace std;

vector<int> left;
vector<int> right;
int leftCount = 0;
int rightCount = 0;
void leftInsertionSort(int);
void rightInsertionSort(int);
void inputNumber(int, int);

int main(int argc, char** argv) {

    int length = 0;
    int value;
    int median;
    string input;

    while (cin >> input) {
        value = atoi(input.c_str());

        inputNumber(value, median);

        if (leftCount > rightCount) {
            median = (((leftCount + rightCount) / 2) + 1);
            cout << left[median];
        } else {
            median = (((leftCount + rightCount) / 2) + 1) - leftCount;
            cout << right[median];
        }
    }

    return 0;
}

void inputNumber(int value, int median) {
    if (leftCount == 0 && rightCount == 0) {
        left[0] = value;
        median = value;
        leftCount++;
    } else
    if (leftCount == 1 && rightCount == 0) {
        right[0] = value;
        if (left[0] > right[0]) {
            right[0] = left[0];
            left[0] = value;
        }
        median = right[0];
        rightCount++;
    } else
    if (value < median) {
        left[leftCount] = value;
    } else {
        right[rightCount] = value;
    }
}

void leftInsertionSort(int lLength)
{
    leftCount++;
    int key, i;
    for(int j = 1; j < lLength; j++)
    {
        key = left[j];
        i = j - 1;
        while (left[i] > key && i >= 0) {
            left[i+1] = left[i];
            i--;
        }
        left[i+1] = key;
    }
}

void rightInsertionSort(int rLength)
{
    rightCount++;
    int key, i;
    for(int j = 1; j < rLength; j++)
    {
        key = right[j];
        i = j - 1;
        while (right[i] > key && i >= 0) {
            right[i+1] = right[i];
            i--;
        }
        right[i+1] = key;
    }
}

私が得ているように見えるエラーは「エラー:「左」への参照があいまいです」です

4

3 に答える 3

2

それをコンパイルしようとしたときに発生するコンパイラエラーから判断すると、名前空間は変数名としても使用している名前とをstd定義しているようです。コンパイラは使用する定義を決定できないため、エラーが発生します。名前空間からすべてをインポートすることが嫌われているのは、このような理由からです。必要な名前を明示的にインポートするか、名前空間修飾子を使用する方がよいでしょう。leftright

いずれにせよ、あなたのアルゴリズムは不必要に複雑に見えます。新しい数値を取得したときに単一のベクトルを保持push_backし、挿入アルゴリズムを使用してその数値を正しいインデックスに配置し、ベクトルの上部中央の要素を返すだけではどうですか?

于 2012-06-10T06:57:35.767 に答える
1

はのフラグですiostream

変数の名前を変更するだけです。

于 2012-06-10T07:00:48.433 に答える
1

これは、なぜ#using namespace stdそれが良い考えではないかを示す良い例です。leftまた、名前空間rightに対しても定義されており、競合が発生しています。stdその行を省略し、名前空間を明示的に指定してvector、string、cin、およびcoutを参照する場合、std::この競合は発生しません。

于 2012-06-10T07:05:42.723 に答える