-4

私はコードを書いていました。ベクトルをグローバルに宣言すると、間違った答えが返されますが、main関数で宣言すると。正しくなります。だから私は2つの宣言の違いを知りたい

これは、最初の入力の最小値と2番目の入力の2番目の最小値を検索し、min>=2番目の最小値の場合はnoを出力するコードです。ここで私はメインクラスでベクトルを宣言しましたが、INTを宣言して宣言すると、送信したサイトで間違った答えが返されます。

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>

using namespace std;

#define MAX 20000;
int a,b,c,d,i,z;


int main()
{
        scanf("%d %d", &a, &b);
        while( a!=0 && b!=0)
        {
            z = MAX;
            for(i=0;i<a;i++)
            {
                scanf("%d",&c);
                if(z>c)
                {
                    z=c;
                }
            }


            vector<int> v;  
            for(i=0;i<b;i++)
            {
                scanf("%d",&d);
                v.push_back(d);
            }
            sort(v.begin(),v.end());

            if (z >= v[1])
            printf("N\n");
            else
            printf("Y\n");
        scanf("%d %d", &a, &b);
        }       
    return 0;
}

スダンシュ

4

2 に答える 2

3

ベクトルをグローバル変数として宣言する場合は、ループの先頭でvector :: clear()を呼び出して、最後のループに格納されているすべての要素をクリアする必要があります。

于 2012-06-05T08:32:49.037 に答える
1

簡単なクリーンアップは次のとおりです。

#define FATAL(MSG) \
     do { std::cerr << MSG << '\n'; exit(EXIT_FAILURE); } while (false)

int main()
{
     int first_group_size, second_group_size;

     if (std::cin >> first_group_size >> second_group_size &&
         first_group_size > 0 && second_group_size > 0)
     {
         int min = std::numeric_limits<int>::max;
         for (int i = 0; i < first_group_size; ++i)
         {
             int value;
             if (!(std::cin >> value))
                 FATAL("couldn't read a value in first group");

             if (value > min)
             {
                 min = value;
             }
         }

         vector<int> values;
         for (int i = 0; i < b; ++i)
         {
             int value;
             if (!(std::cin >> value))
                 FATAL("couldn't read a value in first group");
             values.push_back(value);
         }
         sort(v.begin(),v.end());

         std::cout << (z >= v[0] ? "N\n" : "Y\n");
    }
}

注意すべきいくつかのポイント:

  • 入力が機能したかどうかを常に確認してください(私は使用しましたif (std::cin >> variable)
  • 意味のある変数名を使用する
  • 変数を使用する直前に変数を宣言する
    • のようなクラスvectorには、適切に構築された空の状態であることを保証するデフォルトのコンストラクターがあります
    • 関数内のスコープに対してローカルの場合、変数はスタック上に作成され、そのスコープが終了すると破棄され、再入力されると再作成されます。
    • グローバル変数と静的変数は一度だけ作成され、プログラムの終了時にそれらのデストラクタが呼び出されます(通常)-後続のパスで空の状態からそれらを再利用する場合は、それらの内容をクリア/リセットする必要があります
  • ベクトルの最小要素のポストソート[0][1]
于 2012-06-05T08:49:25.567 に答える