2016-06-20 5 views
2

オンラインで見つかったコードを調べて、ベクトルの配列にアクセスするコードが少し離れていることがわかりました(難読化)。次のようにC++で配列にアクセスするためのコード難読化

配列とvisitedが宣言されています。プログラムで

vector<int> graph[ MAXN + 1 ], graphT[ MAXN + 1 ], sorted; 
bool visited[ MAXN + 1 ]; 

そしてさらに、それは以下のようにアクセスします。

if (!visited[ graph[ S ][ i ] ]) {   //--->>>??? 
      dfs1(graph[ S ][ i ]); 
     } 

誰かが私がvisited [ graph[ S ][ i ] ]正しい方法を説明する助けてもらえ配列visitedにアクセスするための構文?また、それにアクセスする他の簡単な方法はありますか?

注:Sは、任意の値のランダム変数で、たとえば1です。コードの実際のリンクはhereです。私は9行目、10行目、27行目、28行目、29行目について話しています。もちろん、コードは正常にコンパイルされ、必要な出力が生成されます。ありがとう。

答えて

1

は、std::vector<int>オブジェクトの配列です。 graph[S]は、その配列のS番目の要素を返します。タイプはstd::vector<int>&です。 std::vectoroperator[](size_t)を実装しているので、graph[S][i]は、位置Sに格納されたベクトルのi番目のメンバーをに返します。

graph[S][i]のタイプはint&であり、暗黙的にsize_tに変換することができます。インデックスとしてsize_tを配列(visited)に渡すと、その要素への参照が返されます。すなわち

:は[x][y]を使用して索引付けすることができるint S 1)の二次元アレイです。 visited配列にインデックスとして使用される値を返します。


1) それは著者が2次元(最初のための古典的な配列、第二のためにstd::vector)のための異なる容器を使用することを決めた、奇妙です。インデックス作成演算子([])を使用してどちらかのインデックスを作成できますが、これは少し混乱させます。
より一貫性を持たせるためにstd::vector< std::vector<int> > graph(MAXN + 1);と書かれている可能性があります。

+0

感謝。 2番目のパラグラフでもう少し詳しいことを教えてください。どのようにタイプが 'const int&'であることをあなたは理解しましたか?そして 'visited'はconst参照を返しますか? –

+0

'graph'は' const'オブジェクトではないので、 'graph [S]'は 'std :: vector &'と評価されます。 –

+0

@RSahu:配列の戻り値の型がどのように導き出されるのかを説明する標準的なリファレンスがありますか? – IInspectable

5

これはC++ 11の機能が使用されておらず、難読化されていないという点でC++ 11ではありません。

次のようにして、は非constであると仮定すると、コードを書き換えることができます。

std::vector<int> & g0 = graph[S]; 
int & g1 = g0[i]; 
if (!visisted[g1]) 
    dfs1(g1); 
+0

ありがとうございます。 std :: vector g0'だけでなく、 'std :: vector const&g0'と書かれた理由を詳しく教えてください。あなたはどうやって理解しましたか、違いは何ですか? –

+0

@ user6490375違いは、 'operator []'はコピーを返しません。参照(おそらくconst)を返します。あなたは確かにその参照からコピーを作ることができますが、それは恐ろしい早すぎるペシミザであるでしょう - あなたはこれらのコピーを必要とせず、コンパイラはそのようなコピーを作成しません。 –

関連する問題