2

ベクター内のデータへのポインターを取得するには、使用できます

vector<double> Vec;    
double* Array_Pointer = &(Vec[0]);
Function(Array_Pointer);

セット内のデータへのポインタを取得することは可能ですか? 上記のように配列ポインタとして使用できますか?


不可能な場合、セットからベクトルを作成する最良の方法は何ですか? つまり、すべての要素をループしないということです。

4

2 に答える 2

6

いいえ、これは必ずしも可能ではありません。C ++ ISO標準は、要素の連続ストレージを明示的に保証しているstd::vectorため、最初の要素のアドレスを安全に取得して、生の配列を指しているかのようにそのポインターを使用できます。標準ライブラリの他のコンテナには、この保証はありません。

この理由は、std::setのほとんどの操作を効率的にサポートするためです。実装では、バランスの取れた二分探索木のような複雑なデータ構造を使用して、データを格納および整理する必要があります。これらの構造は本質的に非線形であり、ノードを割り当ててリンクする必要があります。これをフラット配列の要素で効率的に機能させることは、標準で定められた時間の制約(ほとんどの操作で償却O(log n))では、不可能ではないにしても困難です。

編集:あなたの質問に答えて-セットを繰り返して要素をコピーするコードなしでstd::vectorからを構築する方法はありません。範囲コンストラクターstd::setを使用すると、ループを明示的に使用せずにこれを行うことができます。std::vector

std::vector<T> vec(mySet.begin(), mySet.end());

お役に立てれば!

于 2013-01-24T02:29:48.697 に答える
1

いいえ。これを実行setできるような方法で実装することはできません。

要素が単一の配列に格納されるように実装する場合set、要素をさらに追加すると、必然的にその配列をある時点で再割り当てする必要があります。その際、既存の要素への参照は無効になります。

の機能の1つは、他の要素を追加(または削除)した場合に要素への参照が無効にならないことをset保証することです。[associative.reqmts]で述べられているように:

およびメンバーは、イテレータおよびコンテナへの参照の有効性に影響を与えないものとし、insertメンバーは、イテレータおよび消去された要素への参照のみを無効にするものとします。emplaceerase

したがって、セットのすべての要素が単一の配列に格納されるような方法で実装することは不可能です。set

これは、O(log n)の挿入/削除/ルックアップ(少なくとも非常に目を細めて、少なくともO(log n)の挿入時間を償却できる場合)、またはソートされた順序の維持などの効率要件とは関係がないことに注意してください。またはそのようなもの。これらだけであれば、基礎となる要素の上にあるデータ構造で簡単に処理でき、要素自体を配列に格納できます。また、イテレータは抽象的であるため、イテレータの無効化に関する保証とは何の関係もありません。

いいえ、あなたを阻んでいるのは参照無効化の要件だけです。

于 2013-01-24T03:05:53.370 に答える