2012-01-31 2 views
3

Я пытаюсь использовать unordered_set из библиотеки std C++. Я использую пространство имен std.Проблемы с сборкой с неупорядоченным набором

using namespace std; 

unordered_set находится в пределах моей функции. Я хотел бы использовать его для запоминания некоторых значений.

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(); 
    } 
} 

Однако, я получаю эту ошибку компиляции:

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

Однако я назначить тип для unordered_set - int правильно? Что означает эта ошибка?

+4

Вы '#include '? –

+1

Вы компилируете с помощью '-std = C++ 0x'? – ildjarn

+1

'std :: unordered_set :: insert' не принимает два' int ', это занимает только один. Может быть, вы думаете о 'std :: map'? –

ответ

9
  1. Прежде всего, никогда не using namespace std - это источник тысячи неприятных ошибок.
  2. done_before действительно не называет тип, он называет переменную. Чтобы назвать тип, вы можете использовать typedef unordered_set<int> done_before_type, тогда done_before_type::iterator будет работать.
  3. Вам необходимо включить заголовок <unordered_set>
  4. Наконец, вам нужен компилятор, который его поддерживает (VS 2010+, GCC 4.4+) или правильное использование через библиотеки Boost или TR1.
4

должен быть unordered_set<int>::iterator node_found = ...

Я обычно использую ЬурейеЕ упростить именование шаблонных переменных:

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

Спасибо, это было что-то исправить. Тем не менее такая же ошибка компиляции. – dangerChihuahua007

2

Прежде всего, unordered_set находится в TR1 или C++ 11.

И, во-вторых, вы объявляете набор внутри своей функции, а затем тестируете какое-то значение в нем. В чем смысл? Набор будет пустым каждый раз, когда вы вызываете функцию. EDIT: извините, не заметил, что он был статичным.

+0

Но это статично, правда? Не должно ли оно поддерживать состояние через вызовы функций? – dangerChihuahua007

 Смежные вопросы

  • Нет связанных вопросов^_^