C++ подобные LINQ операции итератора

Убедитесь, что вы выполняете mvn exec:java из того же каталога, где находится ваш pom.xml с конфигурацией exec.

12
задан Eamon Nerbonne 14 October 2009 в 13:13
поделиться

4 ответа

Это может привести к parse (eval (...)) , после чего вы открыты для этой критики:

R> library(fortunes)
R> fortune("parse")

If the answer is parse() you should usually rethink the question.
   -- Thomas Lumley
      R-help (February 2005)

R>

Так что ваши функции должны вызываться MyFunction.1 и т. Д.?

или Phoenix быстро становится неуправляемо большим и громоздким для записи.

Вот почему я избегал в приведенном выше коде назначать результат make_xxx_iterator переменной. Функция "авто" C ++ 0x будет здесь очень кстати.

Но все же итераторы C ++ не могут жить «в одиночку»: они должны приходить парами, чтобы быть полезными. Таким образом, даже с "auto" это все равно непросто:

auto begin = make_transform_iterator(construct<std::string>('*', _1), 
    make_filter_iterator(_1 > 2, vec.begin())
);
auto end = make_transform_iterator(construct<std::string>('*', _1), 
    make_filter_iterator(_1 > 2, vec.end())
);

Избегание использования лямбда делает вещи подробными, но управляемыми:

struct MakeStringOf{
    MakeStringOf(char C) : m_C(C){}
    char m_C;

    std::string operator()(int i){return std::string(m_C, i);}
};

struct IsGreaterThan{
    IsGreaterThan(int I) : m_I(I){}
    int m_I;

    bool operator()(int i){return i > m_I;}
};

typedef boost::filter_iterator<
   IsGreaterThan, 
   std::vector<int>::iterator
> filtered;

typedef boost::transform_iterator<
   MakeStringOf, 
   filtered
> filtered_and_transformed;

filtered_and_transformed begin(
    MakeStringOf('*'), 
    filtered(IsGreaterThan(2), vec.begin())
);

filtered_and_transformed end(
    MakeStringOf('*'), 
    filtered(IsGreaterThan(2), vec.end())
);

Библиотека Boost.RangeEx (пока еще не) является многообещающей в этом отношении, поскольку она позволяет объединить два итератора в один диапазон. Примерно так:

auto filtered_and_transformed = make_transform_range(
    make_filter_range(vec, _1 > 2),
    construct<std::string>('*', _1)
);
4
ответ дан 2 December 2019 в 05:41
поделиться

У Спуститься на веревке библиотеки есть многие https://, у github.com/abseil/abseil-cpp/blob/master/absl/algorithm/container.h есть много контейнерных функций: c_all_of, c_any_of, c_none_of, c_find, c_count, c_count_if, c_replace_copy, c_unique_copy, c_min_element, c_max_element, c_accumulate

0
ответ дан 2 December 2019 в 05:41
поделиться

См. эту ветку групп Google.

vector<int> numbers = {1, 2, 3, 4, 8, 5, 9 , 24, 19, 15, 12 } 
auto query = 
    from(numbers).
        where([](int i) { return i < 15 && i > 10}). 
        select(fields::full_object); 

Я не смог найти ничего более или менее "официального" или широко распространенного, но вы можете попробовать связаться с автором исходное сообщение.

4
ответ дан 2 December 2019 в 05:41
поделиться

Я хотел бы порекомендовать вам библиотеку P-Stade.Oven . Это сильно усовершенствованная библиотека, работающая с диапазонами STL и имеющая множество LINQ-подобных функций, включая эквиваленты .Where, .Select .Skip .Take и .Concat.

6
ответ дан 2 December 2019 в 05:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: