-4

我正在编写一个代码,其中当我全局声明一个向量时,它给出了错误的答案,但是当我在主函数中声明它时。它变得正确。所以我想知道这两个声明之间的区别

这是一个代码,它找到第一个输入的最小值,第二个输入的第 2 分钟,然后如果 min >= 2nd min 打印 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 回答