Есть ли способ применить оператор if ко всем переменным в C ++ - PullRequest
2 голосов
/ 27 марта 2020

если операторы обычно реализуются как if(variable > value), что если у меня есть несколько переменных, и у них всех есть операция, например, операция декремента, и я хочу, чтобы, если значение любой из этих переменных достигло 0, программа должна заменить до 100. Есть ли простой способ сделать это?

Ответы [ 4 ]

2 голосов
/ 27 марта 2020

Вы не можете сделать это обычным if, но если у вас есть контейнер, содержащий ваши значения, вы можете использовать std::transform и желаемое условие, чтобы выполнить следующие действия:

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    std::vector<int> vec = {1,4 ,-7, 0 ,-9, 9};//The container of the values
    //the following line does every thing
    std::transform(vec.begin(), vec.end(), vec.begin(), [](const int& i){return (i < 0)? 100:i; });
    //To display
    for(auto& el : vec)
        std::cout<< el << " ";

}

И это еще один ответ, вдохновленный ответом @ user2962393

#include <iostream>

void cond(int & h){
    if( h < 0 )
        h=100;
}
template<typename T, typename... Ts>
void set_100_if_cond(T& x, Ts&... xs) {
    (cond(x), ... , cond( xs ));
}

int main() {
    int var1 {50};
    int var2 {0};
    int var3 {-9};
    set_100_if_cond(var1, var2, var3);
    std::cout << var1 << " " << var2 << " " << var3;
}
0 голосов
/ 27 марта 2020

, если любое из этих значений достигает 0, программа должна заменить его на 100.

Один из способов решения этой проблемы - использование шаблонов variadi c и рекурсии ( C ++ 11):

#include <iostream>

template<typename T>
void set_100_if_0(T& x) {
   if (x == 0) x = 100;
}

template<typename T, typename... TT>
void set_100_if_0(T& x, TT&... xx) {
    set_100_if_0(x);
    set_100_if_0(xx...);
}

int main() {
    int foo = 42;
    int bar = 0;
    int baz = 99;
    set_100_if_0(foo, bar, baz);
    std::cout << bar << std::endl;
}

Программа напечатает 100.

Есть ли простой способ сделать это?

Нет. В C ++ нет ничего простого.

0 голосов
/ 27 марта 2020

Если все элементы находятся в контейнере, вы можете использовать std :: any_of . В противном случае вы можете поместить указатели на них в контейнер и использовать тот же алгоритм. Если вы не хотите этого делать, вам, возможно, придется просто напечатать все это или проявить творческий подход.

0 голосов
/ 27 марта 2020

Начиная с C ++ 11 вы можете написать

#include <algorithm>
#include <initializer_list>
if (std::max({a, b, c, d, ..., z}) > value){
}

, если, конечно, все переменные от a до z имеют одинаковый тип; вы можете разыграть их, если нет. ... используется здесь типографски; вставьте ваши фактические имена переменных.

...