У меня есть такой код:

int generatore(std::vector<bool> vettore, int *x) {
    int y;
    
    if (std::adjacent_find(vettore.begin(), vettore.end(), std::not_equal_to<>()) == vettore.end() {
        return *x + 1;
    }
    else {
        do {
            y = rand() % *x;
        } while (vettore.at(y) == true);

        return y;
    }
}

Эта функция в основном получает вектор , в котором хранятся логические значения, которые говорят, были ли уже использованы индексы, и его размер , при вызове он должен возвращать индекс из те, которые не использовались, или * x + 1 , если все они были. Вектор, используемый в качестве параметра, никогда не будет пустым. Значение false будет означать, что этот индекс не использовался, проблема с этим кодом заключается в том, что если все значения равны false, он возвращает * x + 1 вместо выбора одного случайного индекса, поэтому я должен только проверить, все ли значения равны истине , что мне следует изменить?

0
akaManen 2 Май 2021 в 21:15

1 ответ

Лучший ответ

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

if (vettore.front() == false   // add this
    && std::adjacent_find(vettore.begin(), vettore.end(), std::not_equal_to<>()) == vettore.end()) { 
  // ...
}

Выполнение этой проверки перед adjacent_find позволяет потенциально избежать оценки алгоритма.

Вы также можете использовать алгоритм all_of:

if (std::all_of(vettore.begin(), vettore.end(), [](auto b) { return !b; })) {
  // ...
}
1
cigien 2 Май 2021 в 18:47