Как сравнить все элементы вектора один с вектором два, и если элемент max существует, то сравнить все элементы вектора два с вектором три? - PullRequest
0 голосов
/ 08 июня 2019

Я хочу сравнить все элементы вектора x со всеми элементами вектора y, и если я найду элемент больше в векторе y, чем сравниваемый с ним, я должен взять этот конкретный элемент вектора y и сравнить со всеми элементами вектора z, и если это правда, вернуть true, иначе, если я не найду большего элемента в первой итерации i, e, когда элементы вектора 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 вектор 2 с вектором, так как нет значений больше 11, так что это ложь

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Я не знаю, как взять первый элемент вектора один и сравнить со всеми элементами вектора, так как все векторы объединены в последний вектор.

Вы забегаете вперед. Почему вы хотите, чтобы все векторы были объединены в последний вектор? Ответ: нет; это именно то, что случилось. Почему все векторы слились в последний вектор? Ответ: потому что в вашем коде есть ошибка, которая читает данные. Исправьте эту ошибку, вместо того чтобы тратить в десять раз больше усилий на обработку искаженных данных.

Весь этот рассказ о том, что вы собираетесь делать дальше, является не чем иным, как отвлечением, которое тратит впустую время людей, от которых вы просите помощи. Обратитесь за помощью в реальной проблеме (ошибка загрузки) вместо того, чтобы отгонять людей с запутанным вопросом, который предполагает, что плохие данные - это хорошо.


Есть несколько способов исправить ошибку. Я думаю, что самый полезный подход - это тот, который в первую очередь избежал бы ошибки. Вы пытаетесь сделать слишком много в одной функции. Разделяй и властвуй; если у вас есть нетривиальный подэтап, создайте функцию для его обработки. Хорошие практики программирования приводят к меньшему количеству ошибок.

В частности, чтение высоты бойцов в стеке нетривиально. Передайте это помощнику и уменьшите тело вашей внешней петли 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 на нужном уровне, избегая в первую очередь проблемы.

0 голосов
/ 10 июня 2019
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;
}
...