-4

次の 2 つの宣言があるとします。

vector<int> list[N];

vector<vector<int>> list;

list[1].push_back(2); を実行する理由 両方で動作しますか?理論的には、最初のものは 1 次元配列のようなもので、2 番目のものは 2 次元配列のようなものです。(間違っていたら訂正してください) ? しかし驚いたことに、 list[1].push_back(2) が両方で機能していることがわかりました。

誰がこれがどのように起こるのか説明できますか??

説明してください、よろしくお願いします

`

 #include <cstdio>
 #include <vector>
 using namespace std;
 int main(void) {
  vector<int>g[100100];
  int n,m,k;
  scanf("%d%d%d",&n,&m,&k);
  for(int i=0,a,b;i<m&&2==scanf("%d%d",&a,&b);++i)g[a].push_back(b),g[b].push_back(a);
  int s[100100]={0,1},v[100100]={0,1};
  for(int u=0;;++u){
    int a=s[u];
    for(int i=g[a].size();i-->0;){
      int b=g[a][i];
      if(v[b]){
        if(u-v[b]>=k){
          printf("%d\n",u-v[b]+1);
          for(int j=v[b];j<=u;++j)printf("%d ",s[j]);
          return 0;
        }
      }
      else{
        s[v[b]=u+1]=b;
        break;
      }
    }
  }
}

`

このコードは、「K + 1」よりも長いサイクルの長さを見つけるために使用されます。私が取り組んでいた質問..サンプルの入力と出力で自分で確認できます

input
3 3 2
1 2
2 3
3 1
output
3
1 2 3 
4

4 に答える 4

4

ベクトルの配列を宣言しているため、動作します。

特定のサイズのベクトルが必要な場合は、サイズをコンストラクターに渡す必要があります。

std::vector<int> g(size);

ただし、push_back上記のように宣言されたベクトルに対してa を実行すると、値が追加されるにつれてサイズが大きくなることに注意してください。

于 2013-03-07T08:26:03.463 に答える
2

どちらの宣言も似たようなものです。最初の宣言はintのベクトルのCスタイルの配列で、2番目の宣言はintのベクトルのベクトルです。インデックスを作成する場合、Cスタイルの配列とベクトルは同じように動作します。式list[1].push_back(2)は外部コンテナ(Cスタイルの配列またはベクトル)でインデックスを使用します。これは両方で機能します。

そうは言っても、2つの宣言の間に重要な違いがあります。最初の( )は、 N個のベクトルvector<int> list[N]のCスタイルの配列を作成します。結果のコンテナのサイズは一定であり、変更することはできません。2番目の()は、ベクトルの空のベクトルを作成します。そもそも要素がなく、そこへのインデックス付けは未定義の動作です。一方、メモリが許す限り動的に拡張することができます。vector<vector<int> > list;list

原則として、Cスタイルの配列は避けてください。特にローカル変数として、そして特に要素の数がかなり多い場合。スタックサイズは通常制限されているため、この最後はCでも当てはまります。

また、Cスタイルの配列を処理する場合でもベクトルを処理する場合でも、最初に値が範囲内にあることを確認せずに、ユーザーから提供された値を使用してインデックスを作成しないでください。あなたのコードは、入力に応じて、未定義の動作でいっぱいです。フォーマットもかなり悪いです。また、コンマ演算子を使用して2つのステートメントforを使用せずに入力するの{...}は恐ろしいことです。おそらくこれをいくつかの機能に分解する必要があります。そして、魔法の数100100の意味は何ですか?または、svが2番目の要素1で初期化され、他のすべての要素が0であるという事実。

于 2013-03-07T09:07:46.557 に答える
1

vector<int> list[1];
list[0].push_back(2);

int(2)という配列の 0 番目の要素にan を押し戻していlistます。

vector< vector<int> > list[1];
list[0].push_back(2);

vector<int>(2)という配列の 0 番目の要素にa を押し戻していlistます。プッシュ バックする要素は、初期サイズが 2 の int のベクトルです。

注: これは、vector<T>(size_t)代わりに was の場合には発生しませんexplicit vector<T>(size_t)

于 2013-03-07T08:21:18.587 に答える
1

std::vector単一のサイズ引数を受け取るコンストラクターと、多くのオブジェクトをデフォルトで構成するコンストラクターがあります。

C++ 11 では、このコンストラクターは明示的ですが、C++ 98 モードでコンパイルしていると思います。その場合、 にプッシュ1するvector<vector<int> >listと、1が暗黙的に に変換されvector<int>(1)ます。

于 2013-03-07T08:22:58.690 に答える