4

unordered_setC++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よね?このエラーはどういう意味ですか?

4

3 に答える 3

13
  1. まず第一に、決してしないでくださいusing namespace std-それは千の苛立たしいエラーの原因です。
  2. done_before実際には型に名前を付けるのではなく、変数に名前を付けます。使用できるタイプに名前を付けるにはtypedef unordered_set<int> done_before_typedone_before_type::iteratorが機能します。
  3. ヘッダーを含める必要があります<unordered_set>
  4. 最後に、それをサポートするコンパイラ(VS 2010以降、GCC 4.4以降)、またはBoostまたはTR1ライブラリを介した適切な使用法が必要です。
于 2012-01-31T21:06:39.377 に答える
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 = ...
于 2012-01-31T21:06:14.093 に答える
2

まず、unordered_setはTR1またはC++11にあります。

次に、関数内でセットを宣言し、その中の値をテストします。ポイントは何ですか?関数を呼び出すたびに、セットは空になります。編集:申し訳ありませんが、それが静的であることに気づいていませんでした。

于 2012-01-31T21:07:25.887 に答える