Я хочу начать с того, что я действительно новичок в C++ и еще не смог найти ответ на этот вопрос. Это для школьного проекта, и мой учитель не очень помог.
Я хотел знать, как использовать оператор switch с многомерным массивом. Например, скажем, у нас есть этот массив:
int arr[3][5] = {{1, 3, 1, 1, 2}, {1, 2, 4, 5, 6}, {6, 3, 4, 3, 5}};
Как мне использовать оператор switch, чтобы найти отдельные строки и проверить в них определенные критерии?
Изменить: я думаю, будет лучше, если я немного уточню. Я хочу проверить состояние элементов в каждой строке, а не только самих отдельных элементов.
Поэтому я могу проверить, есть ли единицы в первом подмассиве, проверить наличие 3 во втором подмассиве и проверить наличие 4 в последнем подмассиве.
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);
Или, может быть, вы хотите сделать что-то еще? Что ж, для этого вероятно есть алгоритм! Вам просто нужно найти правильный здесь, в
Поэтому я могу проверить, есть ли единицы в первом подмассиве, проверить наличие 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
.
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .
for
.switch (arr[x][y])
... гдеx
иy
— индексы в массиве, возможно, исходящие из вложенного цикла.switch
сам по себе не приведет вас к отдельной строке.switch
не является инструментом для работы, которую вы пытаетесь описать.