проблемы компиляции с неупорядоченным множеством - PullRequest
3 голосов
/ 01 февраля 2012

Я пытаюсь использовать unordered_set из библиотеки C ++ std. Я использую пространство имен 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: в функции 'int do_crazy_calculations(int)':
CplusplusExperiment.cpp: 10: 10: ошибка: 'unordered_set' не называет тип
make: *** [CplusplusExperiment.o] Ошибка 1

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

Ответы [ 3 ]

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

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

Обычно я использую typedef для упрощения именования шаблонных переменных:

typedef unordered_set<int> t_done_before;
static t_done_before done_before;
t_done_before::iterator node_found = ...
2 голосов
/ 01 февраля 2012

Во-первых, unordered_set находится в TR1 или C ++ 11.

А во-вторых, вы объявляете набор внутри своей функции, а затем проверяете в ней какое-то значение.В чем смысл?Набор будет пустым при каждом вызове функции.РЕДАКТИРОВАТЬ: извините, не заметил, что это было статично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...