Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проверка значения контейнера на попадание в зада -


Автор: np9mi7 5.3.2006, 15:46
Добрый день!

Задача: проверить значение контейнера на попадание в заданный интервал;

Решение: воспользоваться стандартными std::less & std::greater. В итоге имеем код:

Код

    std::vector <int> vcVector;

    vcVector.push_back (1);
    vcVector.push_back (2);
    vcVector.push_back (3);
    vcVector.push_back (4);
    vcVector.push_back (5);
    vcVector.push_back (6);
    vcVector.push_back (7);
    vcVector.push_back (8);
    vcVector.push_back (9);
    vcVector.push_back (10);
    
        if ((std::find_if (vcVector.begin (), vcVector.end (), std::bind2nd 
        (std::greater <int> (), 10)) == vcVector.end ()) && (std::find_if 
            (vcVector.begin (), vcVector.end (), std::bind2nd (std::less <int> 
                (), 1)) == vcVector.end ()))
    {
        /// значения попадают в интервал [1, 10];
    }


Недостатки решения: требуется два прохода по контейнеру;

Вопрос: Как используя СТАНДАРТНЫЕ (написание функтора не предлагать) средства, проверить попадание значений элементов контейнера в заданный интервал, исключая повторный проход?

Заранее благодарен за ответы.

Автор: bel_nikita 5.3.2006, 15:57
Не совсем "въехал" в вопрос
Код

int value = 4;

if ( std::find (vcVector.begin(), vcVector.end(), value ) != vcVector.end()  )
{
// попали
}
else
{
// не не попали
}


Автор: np9mi7 5.3.2006, 16:05
Цитата
Не совсем "въехал" в вопрос
, нужно для каждого элемента контейнера организовать проверку вида:
Код

if (1 <= value && value <= 10)
{
         /// попадаем в интервал [1, 10]
}

Автор: bel_nikita 5.3.2006, 16:36
Так найди min и max значение в контейнере и сравни с интервалом.
Если min и max попадают [1, 10], то и сам контейнер "попадает" в интервал [1, 10]

Автор: Void 5.3.2006, 17:31
bel_nikita, это опять-таки не укладывается в один проход, если использовать только стандартные алгоритмы и функторы.

Долго пытался сообразить, как соорудить необходимый предикат из bind'еров и logical_and, в конце-концов оставил это бесполезное занятие. Такое выражение все равно по объему будет больше, и читаться будет хуже, чем написанный по месту применения простой функтор, вроде
Код

struct {
    bool operator ()(int x) const { return x < 1 && x > 10; };
} predicate;
if (find_if(v.begin(), v.end(), predicate) == v.end()) { ... }

Если хочется изящества, можно использовать Boost.Lambda.

Прошу прощения за не несущий полезной информации для автора пост smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)