无序集合的编译问题

时间:2012-01-31 21:03:21

标签: c++ c++11 unordered-set

我正在尝试使用C ++ std库中的unordered_set。我正在使用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 个答案:

答案 0 :(得分:12)

  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库正确使用。

答案 1 :(得分:4)

应为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 :(得分:2)

首先,unordered_set在TR1或C ++ 11中。

第二,你在函数中声明了这个集合,然后在其中测试了一些值。重点是什么?每次调用该函数时,该集都将为空。编辑:对不起,没注意到它是静态的。