我想将向量 x 的所有元素与向量 y 的所有元素进行比较,如果我发现向量 y 中的元素大于比较,我必须获取向量 y 的特定元素并与向量 z 的所有元素进行比较,如果它是真的,则返回 true,否则如果我在第一次迭代 i 中找不到更大的元素,e 当向量 x 的元素与向量 y 进行比较时,我必须中断循环并返回 false。
我试图遍历堆栈的所有元素,但我不知道如何获取向量 1 的第一个元素并与向量的所有元素进行比较,因为所有向量都合并到最后一个向量中。
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 向量 2 与向量 ,因为没有大于 11 的值,所以它是 假
如何获取向量 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;
}
普雷斯托!问题解决了。你所要做的就是更有条理。
附录:这解决了问题的原因是移动stack
声明的额外步骤。在原始代码中,此变量是在外部循环外部声明的,并且从未被清除。结果是它从读取的每一行累积值。在此版本中,变量在读取每一行之前重新初始化,因此值不会累积。您可以通过移动原始代码中的行来获得相同的结果,而无需拆分新函数。但是,拆分一个新函数是一个好习惯,因为它几乎迫使您在正确的级别声明stack
,从而首先避免出现问题。
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;
}