-2

unordered_set から最後の要素を取得する必要があり、他のクラスではなく unordered_set を使用する必要があります。(ほとんどの場合、すでに行われた多くのコードを変更するためです)しかし、私が探していた唯一の可能な方法は、それを繰り返して要素を保存してから返すことです。しかし、大きなセットでは遅すぎるでしょう。その上、私はこれを試しましたが、うまくいきませんでした。

unordered_set <int>::iterator it = frames.end();
--it;

次のエラーが表示されました:「'operator--' in '--it' に一致しません」

主にこのため、この種の便利な機能は、次のように「スタック」方式でデータを保存します。

unordered_set<int> s;
s.insert(9);
s.insert(4);
s.insert(8);
s.insert(0);
s.insert(1);

unordered_set<int>::iterator it = s.end();
for( it = s.begin();  it!= s.end(); ++it )
    cout << *(it) << " ";

それは印刷します:「1 0 8 4 9」

したがって、「最後の」要素は常に 9 であり、前に「スタック」の方法で述べたように、挿入されたのは「最初の」要素です。

それを改善するためのアイデアはありますか?

4

1 に答える 1

2

unordered_set では、挿入の順序は、セットが反復されたときに得られる順序と必ずしも一致しません (したがって、"unordered" という名前が付けられています)。このデータ構造で ( -- 演算子を使用して) 双方向イテレータがサポートされていない理由の一部は、 unordered_set の順序がわからない場合、 unordered_set で前後に移動できても違いがないためです。そこから得られる要素。

作成した挿入の順序は、反復したときに得られる順序を決定するものではありません (最初に "9" を挿入しても、s.end() が "9" を返すという意味ではありません)。これは、その順序が、ハッシュ テーブル ( http://en.wikipedia.org/wiki/Hash_table )と同様に、挿入する各オブジェクトのハッシュ値をそのセットがどのように計算するかにのみ依存するためです。したがって、このセットを確実に使用して「スタック」を複製することはできません。これは、この特定のデータ構造が使用されることを意図したものではないためです。

http://www.cplusplus.com/reference/stack/など、順序を保持するために使用できる他の C++ STL データ構造があります。

于 2013-06-09T23:36:03.537 に答える