2012-06-10 5 views
0

Je rencontre une erreur que je n'ai jamais vue auparavant et qui indique que la référence aux choses est ambiguë. Je suis en train d'écrire un petit programme de test qui calcule une médiane en cours d'exécution. Au fur et à mesure que la liste grossit, elle recalcule la médiane. Dans ce cas, la médiane signifie le numéro du milieu dans la liste (ou le haut du milieu). Ainsi, la médiane de 7 est 7, la médiane de 7 et 9 est 9, et la médiane de 7 3 et 9 est 7.Erreur de calcul médian du tri par insertion C++

J'accomplis cela (j'espère) avec deux tableaux dynamiques. Initialement, la première valeur est définie comme la médiane, puis chaque nombre entré est comparé à la médiane actuelle. La médiane est obtenue pour le calcul de l'élément central, entre deux tableaux.

Le tableau de gauche est pour toutes les valeurs inférieures à la médiane, et le tableau de droite est pour tous les plus grands. J'utilise le tri par insertion pour ordonner les nombres dans chaque tableau (c'est super dans les listes presque triées). Je ne comprends tout simplement pas les erreurs que j'obtiens et où je me suis trompé. Je suis relativement nouveau en C++, j'ai donc opté pour une approche plus simple du problème.

#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; 
    } 
} 

L'erreur que je semble être obtenir est «erreur: référence à la « gauche » est ambigu

+0

Et, quelles sont les erreurs? –

+0

erreur: la référence à 'gauche' est ambigu – Edge

+0

Je reçois la même chose pour la droite – Edge

Répondre

2

A en juger par l'erreur du compilateur que je reçois quand vous essayez de compiler cela, il semble que l'espace de noms std définit noms left et right, que vous utilisez également comme noms de variables. Le compilateur ne peut pas décider quelle définition utiliser, vous obtenez donc l'erreur. C'est pour des raisons comme celles-ci que l'importation de tout d'un espace de noms est désapprouvée - vous feriez mieux d'importer explicitement les noms dont vous avez besoin ou d'utiliser des qualificatifs d'espace de noms.

Dans tous les cas, votre algorithme semble inutilement compliqué. Pourquoi ne pas garder un seul vecteur, push_back lorsque vous obtenez un nouveau nombre, placez le nombre à l'index de droite en utilisant un algorithme d'insertion, puis renvoyez simplement l'élément du milieu supérieur du vecteur?

1

left et right sont des drapeaux dans iostream.

Renommez simplement les variables.

1

Ceci est un bon exemple de pourquoi #using namespace std n'est pas une bonne idée. left et right sont également définis pour l'espace de noms std et il y a maintenant un conflit. Si vous omettez cette ligne et faites référence à vector, string, cin et cout en spécifiant explicitement leur espace de noms avec std::, vous n'auriez pas rencontré ce conflit.

Questions connexes