我想要判断较短的数组是否是较长数组的前缀,我想要先输入数组元素

我想要判断较短的数组是否是较长数组的前缀,我想要先输入数组元素,可是为什么两个while不能连着一起使用呢?

#include <iostream>
#include <vector>
using std::cin; using std::cout;
using std::endl; using std::vector;
int main()
{
    vector<int> ivec1, ivec2;
    int num;
    cout << "Enter the first vector:";
    while (cin >> num)
        ivec1.push_back(num);
    cout << "Enter the second vector:";
    while (cin >> num)
        ivec2.push_back(num);

    int flag = 1;
    for (int i = 0; i < (ivec1.size() <= ivec2.size() ? ivec1.size() : ivec2.size()); ++i)
        if (ivec1[i] != ivec2[i]) {
            flag = 0;
            break;
        }
    if (flag) 
        cout << "YES\n";
    else 
        cout << "NO\n";
    return 0;
}

运行结果如下:

img

引用 皆我百晓生 小程序回复内容作答:
两个while循环不能连续使用,是因为cin会在遇到输入错误或者文件结尾时(例如输入结束符或者结束字符),将failbit置位,这会导致后续输入失败。在两个while循环连续使用时,第二个while循环会因为错误的输入状态而无法正常执行。为了解决这个问题,可以在第一个while循环后使用cin.clear()函数清除错误状态,并使用cin.ignore()函数忽略错误的输入,然后再进行第二个while循环的输入。修改后的代码如下:

#include <iostream>
#include <vector>
using std::cin; using std::cout;
using std::endl; using std::vector;

int main()
{
    vector<int> ivec1, ivec2;
    int num;
    cout << "Enter the first vector:";
    while (cin >> num) {
        ivec1.push_back(num);
    }

    cin.clear();
    cin.ignore(INT_MAX, '\n'); // 清除错误状态并忽略错误的输入

    cout << "Enter the second vector:";
    while (cin >> num) {
        ivec2.push_back(num);
    }

    int flag = 1;
    for (int i = 0; i < (ivec1.size() <= ivec2.size() ? ivec1.size() : ivec2.size()); ++i) {
        if (ivec1[i] != ivec2[i]) {
            flag = 0;
            break;
        }
    }

    if (flag) {
        cout << "YES\n";
    } else {
        cout << "NO\n";
    }

    return 0;
}

这样修改后,就可以连续输入两个数组的元素。

【以下回答由 GPT 生成】

问题标题: 判断较短的数组是否是较长数组的前缀

问题标签: 数据结构

问题内容: 我想要判断较短的数组是否是较长数组的前缀,我想要先输入数组元素,但为什么两个 while 循环不能连着一起使用呢?以下是我的代码实现,请帮我优化一下:

#include <iostream>
#include <vector>
using std::cin; using std::cout;
using std::endl; using std::vector;

int main()
{
    vector<int> ivec1, ivec2;
    int num;
    cout << "Enter the first vector:";
    while (cin >> num)
        ivec1.push_back(num);
    cout << "Enter the second vector:";
    while (cin >> num)
        ivec2.push_back(num);

    int flag = 1;
    for (int i = 0; i < (ivec1.size() <= ivec2.size() ? ivec1.size() : ivec2.size()); ++i)
        if (ivec1[i] != ivec2[i]) {
            flag = 0;
            break;
        }
    if (flag) 
        cout << "YES\n";
    else 
        cout << "NO\n";
    return 0;
}

运行结果如下: img

请帮我优化一下以上代码。


首先,原代码并没有问题,而且是一个非常好的解决方案。不过,你提到想要优化代码,以下是一种可能的优化方式:

#include <iostream>
#include <vector>
using std::cin; using std::cout;
using std::endl; using std::vector;

bool isPrefix(vector<int>& ivec1, vector<int>& ivec2) {
    size_t minSize = std::min(ivec1.size(), ivec2.size());
    for (size_t i = 0; i < minSize; ++i) {
        if (ivec1[i] != ivec2[i]) {
            return false;
        }
    }
    return true;
}

int main() {
    vector<int> ivec1, ivec2;
    int num;
    cout << "Enter the first vector:";
    while (cin >> num)
        ivec1.push_back(num);
    cout << "Enter the second vector:";
    while (cin >> num)
        ivec2.push_back(num);

    if (isPrefix(ivec1, ivec2)) {
        cout << "YES\n";
    } else {
        cout << "NO\n";
    }
    return 0;
}

这里我们将逻辑封装到了一个函数isPrefix中。此函数接收两个vector参数,比较两个vector是否满足前缀关系。这样可以使代码更加模块化和可重用。

另外,在判断数组长度的时候,我们使用了std::min函数来找到较小的长度,避免了使用复杂的三目运算符。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^