Я хочу начать с того, что я действительно новичок в C++ и еще не смог найти ответ на этот вопрос. Это для школьного проекта, и мой учитель не очень помог.

Я хотел знать, как использовать оператор switch с многомерным массивом. Например, скажем, у нас есть этот массив:

int arr[3][5] = {{1, 3, 1, 1, 2}, {1, 2, 4, 5, 6}, {6, 3, 4, 3, 5}};

Как мне использовать оператор switch, чтобы найти отдельные строки и проверить в них определенные критерии?

Изменить: я думаю, будет лучше, если я немного уточню. Я хочу проверить состояние элементов в каждой строке, а не только самих отдельных элементов.

Поэтому я могу проверить, есть ли единицы в первом подмассиве, проверить наличие 3 во втором подмассиве и проверить наличие 4 в последнем подмассиве.

0
NopeNoRoboHere 4 Фев 2022 в 07:51
Вы хотите перебрать все строки и столбцы массива и проверить определенное условие для отдельных элементов? Для этого вы можете использовать цикл for.
 – 
Anoop Rana
4 Фев 2022 в 07:55
1
Каков критерий, можете ли вы сформулировать вокруг него функцию, которая возвращает true или false?
 – 
Fantastic Mr Fox
4 Фев 2022 в 08:02
Вы можете сделать что-то вроде switch (arr[x][y])... где x и y — индексы в массиве, возможно, исходящие из вложенного цикла. switch сам по себе не приведет вас к отдельной строке.
 – 
jkb
4 Фев 2022 в 08:03
1
Как бы я использовал оператор switch... -- Это все равно, что спросить "как бы я использовал молоток, чтобы испечь торт". Оператор switch не является инструментом для работы, которую вы пытаетесь описать.
 – 
PaulMcKenzie
4 Фев 2022 в 08:08

2 ответа

Короткий ответ; ты бы не стал. swtich не подходит для этой работы. Вы ищете по некоторым критериям правильно? При отсутствии конкретных критериев допустим, что вас интересует, содержит ли подмассив 1.

Мы можем сформулировать это с помощью функции:

bool contains_a_1(int arr[5]) {
    return std::any_of( // This is an algorithm that will check if any of them 
                        // match the predicate below
        std::begin(arr), std::end(arr), // This is the range to check over
        [](int v) { return v == 1; } // This is a simple lambda function that tells the
                                     // algorithm what we are looking for. 
);

Теперь у нас есть функция, которая проверяет наше условие. Итак, теперь нам нужно проверить это, но как? Если мы хотим проверить, соответствует ли какой-либо из массивов в нашем массиве этому условию, мы уже видели вещь, которая может нам в этом помочь, std::any_of:

int arr[3][5] = {{1, 3, 1, 1, 2}, {1, 2, 4, 5, 6}, {6, 3, 4, 3, 5}};
bool there_is_a_one_somewhere = std::any_of(std::begin(arr), std::end(arr), contains_a_1);

Или, может быть, вам нужно это логическое значение для каждого значения в массиве:

std::array<bool, 3> contains_1;
std::transform(std::begin(arr), std::end(arr), std::begin(contains_1), contains_a_1);

Или, может быть, вы хотите сделать что-то еще? Что ж, для этого вероятно есть алгоритм! Вам просто нужно найти правильный здесь, в .

0
Fantastic Mr Fox 4 Фев 2022 в 08:23

Поэтому я могу проверить, есть ли единицы в первом подмассиве, проверить наличие 3 во втором подмассиве и проверить наличие 4 в последнем подмассиве.

Вы можете использовать циклы for для перебора строк и std::find для проверки того, содержит ли подмассив определенный элемент, как показано ниже:

#include <iostream>
#include <algorithm>
int main()
{
    int arr[3][5] = {{1, 3, 1, 1, 2}, {1, 2, 4, 5, 6}, {6, 3, 4, 3, 5}};
    
    //iterate over rows
    for(auto &row: arr)
    {
        bool exists = std::find(std::begin(row), std::end(row), 1) != std::end(row); //check if 1 is present in the current row
        std::cout<<"element "<<(exists?"is present":"not present")<<std::endl;
        
    }    
}

В приведенном выше коде мы проверили, присутствует ли 1 в подмассиве или нет. Точно так же вы можете проверить другие значения, такие как 3 или 4.

0
Anoop Rana 4 Фев 2022 в 08:55