Подтвердить что ты не робот

Есть ли библиотека LINQ для С++?

Есть ли какие-либо механизмы агностики (не CLI) платформы, чтобы каким-то образом получить LINQ для С++?

Я имею в виду, что большая часть серверных фреймворков во всем мире работает на основе UNIX и имеет доступ к LINQ для С++ в UNIX, вероятно, сделает много людей счастливыми!

4b9b3361

Ответ 1

Linq ++ от Hong Jiang выглядит неплохо. Его синтаксис намного ближе к Linq, чем CLinq. Linq pfultz2 также выглядит интересным, но ему нужен компилятор С++ 11.

Ответ 2

Microsoft объявила , что они построили LINQ для C и С++. Пока еще нет.

Обновление 11/06/2012:

Microsoft Open Technologies, Inc. выпустила и open-sourced (версия Apache License 2.0) количество связанных библиотек, включая реализацию LINQ (Ix ++) и новую библиотеку Reactive Extensions (Rx ++).

Ответ 3

Это мое решение библиотеки шаблонов С++ LINQ.
Исходный код находится здесь: Boolinq
Есть много тестов по каждой функции.
Я сейчас работаю над этим.

Любые комментарии?
Могут быть советы?

UPDATE: проект переместился в https://github.com/k06a/boolinq и теперь имеет версию 2.0 с только 700 строк исходного кода:)

Ответ 4

http://cpplinq.codeplex.com/ - очень хорошая реализация.
От автора:
Мотивация для CppLinq заключается в том, что как boolinq, так и Native-RX, по-видимому, основаны на операторе ". для создания функций списка. Проблема в том, что"." что он не может быть перегружен в С++, что затрудняет расширение этих библиотек функциями моего собственного дизайна. Для меня это важно. CppLinq основан на операторе → , который перегружен, поэтому CppLinq можно сделать расширяемым.

Ответ 5

Вы можете взглянуть на PSade.Oven, сильно усиленную библиотеку, работающую на диапазонах STL и предоставляющую множество функций LINQ.

Ответ 6

Я написал небольшую библиотеку cppLinq, которая перегружает IEnumerable < > и ее операторы LINQ. Это всего лишь эксперимент; пока он работает только в Windows (сопрограммы реализованы с использованием волокон Win32) и только строятся с Dev Preview VS11 (он сильно использует выражения лямбда: -)).

Он позволяет писать код следующим образом:

auto source = IEnumerable<int>::Range(0, 10);

auto it = source->Where([](int val) { return ((val % 2) == 0); })
                ->Select<double>([](int val) -> double { return (val * val); }));

foreach<double>(it, [](double& val){
    printf("%.2f\n", val);
});

Ответ 7

На самом деле, если вы просто хотите использовать Linq для понимания списка, вы можете использовать эту библиотеку Linq. Он требует С++ 11 (он будет работать в MSVC 2010) и Boost. С помощью библиотеки вы можете написать запросы linq следующим образом:

struct student_t
{
    std::string last_name;
    std::vector<int> scores;
};

std::vector<student_t> students = 
{
    {"Omelchenko", {97, 72, 81, 60}},
    {"O'Donnell", {75, 84, 91, 39}},
    {"Mortensen", {88, 94, 65, 85}},
    {"Garcia", {97, 89, 85, 82}},
    {"Beebe", {35, 72, 91, 70}} 
};

auto scores = LINQ(from(student, students) 
                   from(score, student.scores) 
                   where(score > 90) 
                   select(std::make_pair(student.last_name, score)));

for (auto x : scores)
{
    printf("%s score: %i\n", x.first.c_str(), x.second);
}

Будет выводиться:

Omelchenko score: 97
O'Donnell score: 91
Mortensen score: 94
Garcia score: 97
Beebe score: 91

Ответ 8

С++ 0x, или что бы то ни было, вызывающее его, имеет новое ключевое слово auto, которое позволяет вводить тип. И да, на С++ будет лямбда. Кроме того, быстрый Google поиск показал это, CLinq.

Ответ 9

Вот еще альтернатива, которая просто является оберткой вокруг алгоритмов boost и stl, и, таким образом, вы получаете большую часть преимуществ производительности этих реализаций.

Он работает следующим образом:

std::vector<int> xs;
auto count = from(xs)
   .select([](int x){return x*x;})
   .where([](int x){return x > 16;})
   .count();
auto xs2 = from(xs)
   .select([](int x){return x*x;})
   .to<std::vector<int>>();

Обратите внимание, что некоторые методы возвращают прокси для пустых диапазонов, например.

std::vector<int> xs;
auto max = from(xs)
   .select([](int x){return x*x;})
   .where([](int x){return x > 16;})
   .max()
   .value_or(default_max_value);

Обратная связь приветствуется.

Ответ 10

Вот моя реализация С++ - linq с С++ 11 (на китайском):

http://www.cnblogs.com/cbscan/archive/2012/10/20/2732773.html

Он поддерживает такие функции, как "отложенный запрос", "основанный на стеке" (как можно меньше использовать оператора new), "копировать семантику" (так что вы можете повторять запрос во множественном числе после его резервного копирования) и т.д.

Он также поддерживает десятки функций, включая "from, select, where, cast, range, all, any, cast, average, содержать, count, first, last, head, tail, groupBy, takeUntil, skipUntil, max, min, сокращение, уникальность, сортировка, случайный, пересекающийся, _union".

Я думаю, что мой код достаточно прост, чтобы понять и расширить его кем-либо.

Ответ 11

Я не думаю, что С++ имеет саму компилятор для обработки таких вещей, как лямбда-выражения, поэтому нет, этого не произойдет.