私はC++ STLを初めて使用しますが、グラフ表現を理解するのに苦労しています。
vector<int> adj[N];
それで、これはベクトル型の配列を作成しますか、それとも配列のベクトルを作成しますか? BFSコードは、adj [i]の各インスタンスに存在する値のリストを横断するように見えるため、ベクトルの配列のように機能するようです。ベクトルを作成するための構文は次のとおりです。
vector<int> F;
これにより、1次元のベクトルFが効率的に作成されます。
違いは何ですか
vector< vector<int> > N;
そして
vector<int> F[N]
それで、これは(
vector<int> adj[N];
)ベクトル型の配列を作成するのでしょうか、それとも配列のベクトルを作成するのでしょうか?
ベクトルの配列を作成します
違いは何ですか
vector< vector<int> > N;
そして
vector<int> F[N]
最初のケースでは、動的配列の動的配列(ベクトルのベクトル)を作成しています。各ベクトルのサイズは実行時に変更でき、すべてのオブジェクトがヒープに割り当てられます。
2番目のケースでは、ベクトルの固定サイズの配列を作成しています。コンパイル時にN
を定義する必要があり、すべてのベクトルはスタックに配置されます†ただし、各ベクトルはヒープ上の要素を割り当てます。
私は常にベクトルのベクトルの場合(または、サードパーティのライブラリを使用できる場合はマトリックス)、またはコンパイル時のサイズの場合はstd::array
of std::array
sを好むでしょう。
私はC++ STLを初めて使用しますが、グラフ表現を理解するのに苦労しています。
グラフをstd::unordered_map<vertex_type,std::unordered_set<vertex_type>>
として表すこともできます。ここで、vertex_type
は頂点のタイプです(この場合はint
)。このアプローチは、エッジの数がそれほど多くない場合にメモリ使用量を削減するために使用できます。
†:正確に言うと、常にスタック上にあるわけではなく、ヒープ上の複雑なオブジェクトの一部である可能性があります。さらに、C++標準ではスタックやヒープの要件は定義されておらず、自動、静的、スレッド、動的などのストレージ期間の要件のみが提供されます。
短い答え:vector <int>
sの配列です。
長答:
次のような宣言を読むとき
vector<int> adj[N];
コンパイラは、 "spiral-"または "clockwise-rule"意味を解釈するため。スパイラルルールの背後にある考え方は、変数名から開始し、時計回りのスパイラルで外側に移動して、変数のタイプを把握することです。例えば:
char* str [10];
このように解釈できます:
____
| |
char* str [10];
|_________|
str
を10 char*
sの配列にします。
したがって、vector<int> adj[N];
は配列のベクトルではなくベクトルの配列です
練習で完璧になります:
1:int * foo [ ];
はどういう意味ですか?
回答:
「foo」は整数へのポインターの配列です
2:int * (*foo [ ] )();
はどういう意味ですか?
回答:
「foo」は、整数へのポインタを返す関数へのポインタの配列です
3:int * (*(*foo [ ] )())();
はどういう意味ですか?
回答:
「foo」は、整数へのポインタを返す関数へのポインタを返す関数へのポインタの配列です
vector<int> arr[N];
ベクトルの配列を表示します。各array [i]には、多くの値を通過できるベクトルが格納されます。これは、ヘッドがarray [i]の位置にのみ格納されるリンクリストの配列のようなものです。
vector<vector<int> > N vs vector<int> F[N]
2D VectorとVectorの配列の違いは、2D Vectorのサイズを拡張できるのに対し、ベクトルの配列のサイズは配列サイズに対して固定されていることです。
フードの下では、ベクターはまだ配列を使用しますが、実装固有ですが、次のように考えるのが安全です:
vector<int>
内部的にint []を作成します。ベクトルが提供するのは、サイズを変更したい場合に手動で再割り当てする必要がない部分を抽象化することです(もちろん、それ以上)。 vector<vector<int>>
を実行すると、2D行列を意味するベクトルのベクトルを作成します。必要なだけネストできます。 VectorはT型を受け取り、その型の配列を割り当てます。したがって、vectorをT型として渡すと、最初の行で行ったvector<int>
の配列を効果的に実行します。それが理にかなっていることを願って