2012-01-31 2 views
3

J'essaie d'utiliser un unordered_set à partir de la bibliothèque std C++. J'utilise l'espace de noms std.problèmes de compilation avec un ensemble non ordonné

using namespace std; 

Le unordered_set est dans une fonction de la mienne. Je voudrais l'utiliser pour mémoriser certaines valeurs.

int do_crazy_calculations(int n) { 
    static unordered_set<int> done_before; 
    done_before::iterator node_found = done_before.find(n); 

    // n has not been seen before, so do calculations and memoize the result. 
    if (node_found == done_before.end()) { 
     int result = actually_do_calculations(n); 
     done_before.insert(n, result); 
     return result; 
    } 

    // n has already been seen before, just return the memoized value. 
    else { 
     return node_found.get(); 
    } 
} 

Cependant, je reçois cette erreur de compilation:

CplusplusExperiment.cpp: In function 'int do_crazy_calculations(int)' :
CplusplusExperiment.cpp:10:10: error: 'unordered_set' does not name a type
make: *** [CplusplusExperiment.o] Error 1

Cependant, je n'assignez un type à unordered_set - int droit? Que signifie cette erreur?

+4

Avez-vous '#include '? –

+1

Compilez-vous avec '-std = C++ 0x'? – ildjarn

+1

'std :: unordered_set :: insert' ne prend pas deux' int', il n'en prend qu'un seul. Peut-être que vous pensez à 'std :: map'? –

Répondre

9
  1. Tout d'abord, ne jamais faire using namespace std - c'est une source de mille erreurs frustrant.
  2. done_before ne nomme vraiment pas un type, il nomme une variable. Pour nommer un type, vous pouvez utiliser typedef unordered_set<int> done_before_type, puis done_before_type::iterator fonctionnera.
  3. Vous devez inclure l'en-tête <unordered_set>
  4. Enfin, vous avez besoin d'un compilateur qui supporte (VS 2010+, GCC 4.4+) ou une utilisation appropriée par Boost ou les bibliothèques TR1.
4

devrait être unordered_set<int>::iterator node_found = ...

J'utilise généralement un typedef pour simplifier nommage des variables basé sur un modèle:

typedef unordered_set<int> t_done_before; 
static t_done_before done_before; 
t_done_before::iterator node_found = ... 
+0

Merci, c'était quelque chose à corriger. La même erreur de compilation se produit cependant. – dangerChihuahua007

2

Tout d'abord, unordered_set est dans TR1 ou C++ 11. Ensuite, vous déclarez l'ensemble à l'intérieur de votre fonction, puis vous en tiendrez compte. À quoi ça sert? L'ensemble va être vide chaque fois que vous appelez la fonction. EDIT: désolé, n'a pas remarqué que c'était statique.

+0

Mais c'est statique, non? Ne devrait-il pas maintenir l'état à travers les appels de fonction? – dangerChihuahua007

Questions connexes