Program Club

C ++ 용 LINQ 라이브러리가 있습니까?

proclub 2020. 10. 12. 08:20
반응형

C ++ 용 LINQ 라이브러리가 있습니까?


어떤 방식 으로든 C ++에서 LINQ를 사용하기위한 플랫폼에 구애받지 않는 (CLI가 아님) 움직임이 있습니까?

전 세계 서버 프레임 워크의 상당 부분이 UNIX에서 실행되고 UNIX에서 LINQ for C ++에 액세스하면 많은 사람들이 만족할 것입니다!


Hong Jiang의 Linq ++ 는 좋은 시작처럼 보입니다. 구문은 CLinq보다 Linq에 훨씬 더 가깝습니다. pfultz2의 Linq도 흥미로워 보이지만 C ++ 11 컴파일러가 필요합니다.


Microsoft는 방금 C 및 C ++ 용 LINQ를 구축 했다고 발표 했습니다. 하지만 아직 사용할 수 없습니다.

2012 년 11 월 6 일 업데이트 :

Microsoft Open Technologies, Inc.는 이제 LINQ 구현 (Ix ++) 및 새로운 Rx ++ (Reactive Extensions) 라이브러리를 비롯한 여러 관련 라이브러리를 출시 하고 오픈 소스 (Apache License 2.0)했습니다.


이것은 템플릿 C ++ LINQ 라이브러리의 솔루션입니다.
소스 코드는 다음과 같습니다. Boolinq
각 기능에 대한 많은 테스트가 있습니다.
지금 작업 중입니다.

다른하실 말씀 있나요?
조언이 될 수 있습니까?

업데이트 : 프로젝트가 https://github.com/k06a/boolinq 로 이동 했으며 이제 소스 코드가 700 줄에 불과한 버전 2.0이 있습니다. :)


http://cpplinq.codeplex.com/ 은 아주 좋은 구현입니다.
작성자 :
CppLinq의 동기는 boolinq와 Native-RX가 모두 연산자를 기반으로하는 것 같습니다. " 목록 기능을 구성합니다. 문제는 "." 연산자는 C ++에서 오버로드 될 수 없기 때문에 자체 디자인의 기능으로 이러한 라이브러리를 확장하기가 어렵습니다. 나에게 이것은 중요합니다. CppLinq는 오버로드 가능한 operator >>를 기반으로하므로 CppLinq를 확장 가능하게 만들 수 있습니다.


STL 범위에서 작업하고 많은 LINQ 유사 함수를 제공하는 강력하게 강화 된 라이브러리 인 PSade.Oven을 살펴볼 수 있습니다 .


IEnumerable <> 및 LINQ 연산자를 다시 구현 하는 작은 라이브러리 cppLinq작성했습니다 . 단지 실험 일뿐입니다. 현재로서는 Windows에서만 작동하며 (코 루틴은 Win32 파이버로 구현 됨) VS11의 Dev Preview로만 빌드됩니다 (람다 표현식을 많이 사용합니다 :-)).

다음과 같은 코드를 작성할 수 있습니다.

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);
});

여기에 단순히 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);

피드백을 환영합니다.


실제로 목록 이해를 위해 Linq를 사용하려면이 Linq 라이브러리를 사용할 수 있습니다 . C ++ 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

C ++ 0x 또는 그것이 호출되는 모든 것은 auto유형 추론을 허용 하는 새로운 키워드를 가지고 있습니다. 그리고 예, C ++에 람다가 올 것입니다. 또한 빠른 Google 검색을 통해 CLinq라는 사실이 밝혀졌습니다 .


다음은 C ++ 11 (중국어)을 사용한 C ++-linq 구현입니다.

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

It support features like "deferred query","stack based"(use operator new as little as possible),"copy semantic"(so you can iterate a query multitime after backup it), and so on.

It also support dozens of function including "from, select, where, cast ,range, all, any ,cast, average ,contain, count ,first, last, head, tail ,groupBy ,takeUntil, skipUntil ,max, min ,reduce ,unique, sort, random ,intersect, _union".

I think my code is simple enough to understand and extend by anybody selves.


I don't think C++ has the compiler sugar to handle things such as lambda expressions, so no, that's not going to happen.

참고URL : https://stackoverflow.com/questions/232222/is-there-a-linq-library-for-c

반응형