如何将向量一的所有元素与向量二进行比较,如果存在最大元素,则如何将向量二的所有元素与向量三进行比较?

时间:2019-06-08 14:32:00

标签: c++ vector data-structures compare

我想将向量x的所有元素与向量y的所有元素进行比较,如果我发现向量y中的一个元素比被比较的元素大,我必须将向量y的特定元素与向量y的所有元素进行比较z,如果为true,则返回true,否则,如果我在第一次迭代中没有找到更大的元素,则当将向量x的元素与向量yi进行比较时,必须中断循环并返回false。

我试图遍历堆叠军的所有元素,但是我不知道如何取向量一个的第一个元素并与向量的所有元素进行比较,因为所有向量都合并到了最后一个向量中。

vector<int> stack;

int noofstack, noofoperations, stackno, OperationType;
// Taking the input number of stacks
cin >> noofstack;
vector<vector<int>> stackarmies;
for (int i = 0; i < noofstack; i++)
{
    int stacksize;
    //Since vectors are dynamic and we don't need to declare the size but as per the problem statement I've added it/
    cin >> stacksize;
    for (int k = 0; k < stacksize; k++)
    {
        //Taking the input of all the vectors one by one and then adding all the vectors into one vector

        int armyheight;
         cin>>armyheight;
        stack.push_back(armyheight);
    }
    stackarmies.push_back(stack);

测试用例

输入1

2 
3 3 5 4 
3 1 1 2

结果stackarmies { {3, 5, 4}, {3, 5, 4, 1, 1, 2} }

所需的输出False
我们将取向量1:3的第一个元素,并与所有元素进行比较 向量2的元素,在向量2中没有元素大于3。

输入2

2
3 1 0 4
3 2 1 3 

结果stackarmies { {1, 0, 4}, {1, 0, 4, 2, 1, 3} }

所需的输出True
我们将取向量1:1的第一个元素,并与所有 向量2的元素,在向量2中,第一个元素大于1, 如此

输入3

2
3 1 9 0
2 0 11

结果stackarmies { {1, 9, 0}, {1, 9, 0, 0, 11} }

所需的输出: True
我们将取向量1:1的第一个元素,并与所有 向量2的元素,在向量2中,最后一个元素大于1, 如此

输入4

3
3 0 8 0
3 4 0 11
3 0 9 0

结果stackarmies { {0, 8, 0}, {0, 8, 0, 4, 0, 11} , {0, 8, 0, 4, 0, 11, 0, 9, 0} }

所需的输出: True
我们将取向量1的第二个元素:8并与 向量2,11的所有元素都大于8,因此我们将比较11的 vector 2与vector,因为没有大于11的值,所以它是 错误

2 个答案:

答案 0 :(得分:1)

  

我不知道如何取向量一个的第一个元素并与向量的所有元素进行比较,因为所有向量都合并到了最后一个向量中。

您正在超越自己。为什么要将所有矢量合并到最后一个矢量中?答:你不知道。就是这样。为什么所有向量都合并为最后一个向量?答案:因为您的代码中存在读取数据的错误。修复该错误,而不是花费十倍的精力来处理格式错误的数据。

关于您接下来打算做什么的整个话题只是分散注意力,浪费您正在寻求帮助的人们的时间。寻求真正问题(正在加载的错误)的帮助,而不是使人们以一个令人困惑的问题为前提,即认为不良数据是好的。


有几种方法可以修复该错误。我认为最有用的方法是首先避免该错误的方法。您尝试在单个函数中执行太多操作。分而治之;当您有一个非平凡的子步骤时,请创建一个函数来处理它。良好的编程习惯可以减少错误。

特别是,读取堆栈中的战斗机高度并非易事。将其委托给助手,并将外部for循环的主体减少到一行。

for (int i = 0; i < noofstack; i++)
{
    //* This is non-trivial, so use a helper function.
    stackarmies.push_back(read_fighter_heights());
}

此帮助器函数负责读取一行数据,从中生成一个堆栈(vector<int>),然后返回该堆栈。这涵盖了循环的大部分内容,仅剩下将返回的堆栈推入堆栈向量的简单任务。

从现有代码创建此帮助器功能非常简单。通常,只需将循环的主体移到适当的函数定义中即可。另外,您应该注意,此函数仅需要stack,因此还要将该变量的声明移到新函数的定义中。

vector<int> read_fighter_heights()
{
    vector<int> stack;
    int stacksize;
    //Since vectors are dynamic and we don't need to declare the size but as per the problem statement I've added it/
    cin >> stacksize;
    for (int k = 0; k < stacksize; k++)
    {
        //Taking the input of all the vectors one by one and then adding all the vectors into one vector

        int armyheight;
        cin>>armyheight; //* Reading a single integer is trivial, so no need for another function here.
        stack.push_back(armyheight);
    }
    return stack;
}

Presto!问题解决了。您要做的就是更有条理。

附录:之所以解决该问题,是因为增加了stack声明的移动步骤。在原始代码中,此变量在外部循环外部声明,并且从未清除。结果是它累积了读取的每一行的值。在此版本中,变量将在读取每一行之前重新初始化,因此不会累积值。您可以通过在原始代码中移动该行而获得相同的结果,而无需拆分新功能。但是,拆分新函数是一种好习惯,因为这几乎迫使您在正确的级别上声明stack,从而首先避免了问题。

答案 1 :(得分:0)

bool CompareVectors(vector<vector<int>> st)
{
bool result = true;
for (int k = 0; k < st.size(); k++)
{
    if (k != st.size() - 1)
    {
        if (result)
        {
            for (auto i = st[k].begin(); i != st[k].end(); ++i)
            {
                for (auto j = st[k+1].begin(); j != st[k+1].end(); ++j)
                {
                    if (*i < *j)
                    {
                        result = true;
                        break;
                    }
                    else
                    {
                        result = false;
                    }
                }
                if (result)
                {
                    break;
                }
            }
        }
    }
}
return result;
}