【问题标题】:How to validate the input in vector如何验证向量中的输入
【发布时间】:2021-09-10 12:26:25
【问题描述】:

我尝试使用 C++ 中的向量来验证用户输入。我几乎搜索了一个可能的解决方案,但我找不到解决方案。

#include <iostream>
#include <cstdlib>
#include <vector>
using namespace std;

int main()
{
    std::vector<int> selectFloor = {};
    int maxfloor, currentfloor = 1, select, i, k, inputFloor;

    cout << "How many floors do you want for your elevator? : ";
    cin >> maxfloor;
    cout << "----------This Elevator have " << maxfloor << " Floors---------";
    cout << "\n";

    while(true)
    {
        cout << "select how many floor to select : ";
        cin >> select;

        // Insert
        for(i = 0; i < select; i++)
        {
            cout << "Select floor : ";
            cin >> inputFloor;
            selectFloor.push_back(inputFloor);
        }

        //This is my validation if the input already exist
        if(selectFloor.begin(), selectFloor.end(), inputFloor)
        {
            cout << "Already selected" << endl;
            selectFloor.pop_back(); // pop the last same input
            // Display the input
            for(k = 0; k < selectFloor.size(); k++)
                std::cout << selectFloor.at(k) << ' ';
            break;
        }
    } // end while

    return 0;
}

这是我的示例输出。我进入了 4 层楼,但最后一个弹出窗口

select how many floor to select : 4
Select floor : 1
Select floor : 2
Select floor : 3
Select floor : 4
Already selected
1 2 3

如果没有相同的号码,我想要这个

select how many floor to select : 4
    Select floor : 1
    Select floor : 2
    Select floor : 3
    Select floor : 4
   
    1 2 3 4

但是如果输入已经存在这个例子

select how many floor to select : 4
    Select floor : 1
    Select floor : 2
    Select floor : 3
    Select floor : 3
    Already selected
    1 2 3

【问题讨论】:

  • 一定要用矢量吗?除非这是家庭作业,否则使用unordered_set 会更有意义。它确保其内容是独一无二的。
  • @MustafaOzturk 是的,因为我想熟悉矢量的实际作用。

标签: c++ vector


【解决方案1】:

if(selectFloor.begin(),selectFloor.end(),inputFloor)

这个 if 条件是一个带有两个逗号运算符的表达式,其中每个操作数从左到右计算,除最后一个外的每个操作数都被丢弃。由于前两个操作数没有副作用,因此它们的评估什么也不做,上面的等价于:

if (inputFloor)

这显然不是你想要的。


你需要std::find:

if (std::find(selectFloor.begin(), selectFloor.end(), inputFloor) != selectFloor.end())

或 C++20 的 std::ranges::find:

if (std::ranges::find(selectFloor, inputFloor) != selectFloor.end())

您的代码还有其他问题,例如您需要检查每个输入是否存在输入。

【讨论】:

  • 嗨,我试过了,但输出还是一样。
  • @woofMaranon 正如我所说,您的代码还有其他问题。如果您要学习,您需要使用调试器逐行检查您的代码,并检查每个变量是如何修改的。
  • @woofMaranon 建议:检查输入的楼层是否已经存在于向量中之前push_back它进入向量。如果你在find 之前push_back,它会总是找到它,对吧?
  • Ted 说的是那种你会用调试器自己发现的东西。
【解决方案2】:

你在这里做错了:

if(selectFloor.begin(), selectFloor.end(), inputFloor)

没有场景,, 运算符在条件中的结果将是要检查的inputFloor 的值。您需要检查selectFloor 是否包含inputFloor 的值,您可以使用std::any_of 或更好的std::find

if (selectFloor.cend() != std::find(selectFloor.cbegin(), selectFloor.cend(), inputFloor)

【讨论】:

    猜你喜欢
    • 2019-03-11
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多