C ++의 목록 이해력에 대한 LINQ는 C ++ 용 LINQ 구현을 제공합니다. 현재 C ++ 범위 만 지원하지만 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 ) ;
}위의 C ++ 코드는 이것을 출력합니다 (예는 위의 C ++ 코드) :
Omelchenko score: 97
O'Donnell score: 91
Mortensen score: 94
Garcia score: 97
Beebe score: 91
확장자는 | 사용하여 구현됩니다 파이프 연산자. 이를 통해 일부 특별 기본 클래스에서 물려받지 않고도 모든 범위에 적용 할 수 있습니다. 따라서 확장은 다음과 같이 작동 할 수 있습니다.
vector< int > numbers = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 };
auto r = numbers
| linq::where([]( int x) { return x > 2 ; })
| linq::select([]( int x) { return x * x; });지원되는 확장 방법은 다음과 같습니다.
라이브러리는 또한 range_extension 클래스를 제공하며 자신의 확장 기능도 작성하는 데 사용할 수 있습니다. 먼저 기능을 다음과 같이 함수 객체 클래스로 정의합니다.
struct contains_t
{
template < class Range , class T >
bool operator ()(Range && r, T && x) const
{ return (r | linq::find (x)) != boost::end (r); };
};그런 다음 정적 초기화를 사용하여 확장을 초기화합니다.
range_extension< contains_t > contains = {};그런 다음 확장자는 다음과 같이 사용할 수 있습니다.
if (numbers | contains( 5 )) printf( " We have a 5 " ); 모든 LINQ 쿼리는 from 으로 시작해야합니다. 이는 Lambdas 및 쿼리가 적용될 컨테이너에 사용될 변수 이름을 지정합니다. 또한 여러 from 사용할 수 있습니다.
struct student
{
std :: string name ;
std :: vector < int > grades ;
student ( ) { }
template < class Range >
student ( std :: string name , Range && r )
: name ( name ) , grades ( boost :: begin ( r ) , boost :: end ( r ) )
{ }
} ;
std :: vector < student > students =
{
student ( "Bob" , { 90 , 100 , 75 } )
student ( "Tom" , { 92 , 81 , 70 } )
student ( "Terry" , { 105 , 98 , 94 } )
} ;
// { 90, 100, 75, 92, 81, 70, 105, 98, 94 }
auto q = LINQ ( from ( s , students ) from ( g , s . grades ) select ( g ) ) ; WHERE 절은 술어와 일치하는 요소를 반환합니다. 선택 사항이지만 from Clause 이후에 와야하며 select 조항 앞에 있어야합니다.
vector < int > v = { 1 , 3 , 4 , 5 } ;
// { 1, 3, 5 }
auto q = LINQ ( from ( i , v ) where ( i % 2 ) ) ;SELECT 절은 요소로 변환을 적용합니다. 또한 선택 사항이지만 마지막 조항이어야합니다.
std :: vector < int > v = { 1 , 2 , 4 } ;
// { 3, 6, 24 }
auto q = LINQ ( from ( x , v ) select ( x * 3 ) ) ; orderby 절을 사용하면 범위를 주문할 요소를 지정할 수 있습니다. 또한 순서 방향을 지정하기 위해 선택기가 ascending 또는 descending 선행 할 수 있습니다. 기본값이 오름차순입니다.
struct person
{
std :: string name ;
int age ;
person ( ) { }
person ( std :: string name , int age )
: name ( name ) , age ( age )
{ }
} ;
std :: vector < person > people =
{
person ( "Tom" , 25 ) ,
person ( "Bob" , 22 ) ,
person ( "Terry" , 37 ) ,
person ( "Jerry" , 22 )
}
// { "Jerry", "Bob", "Tom", "Terry" }
auto q = LINQ ( from ( p , people ) orderby ( p . age , descending p . name ) select ( p . name ) ) ; group 조항은 시퀀스의 요소를 그룹화합니다. 첫 번째 매개 변수는 키 선택기이고 두 번째 매개 변수는 값 선택기입니다.
struct person
{
std :: string name ;
int age ;
person ( ) { }
person ( std :: string name , int age )
: name ( name ) , age ( age )
{ }
} ;
std :: vector < person > people =
{
person ( "Tom" , 25 ) ,
person ( "Bob" , 22 ) ,
person ( "Terry" , 37 ) ,
person ( "Jerry" , 22 )
}
auto q = LINQ ( from ( p , people ) group ( p . age , p . name ) ) ; LINQ는 CGE를 사용하여 쉽게 설치할 수 있습니다.
cget install pfultz2/Linq
부스트 종속성이 자동으로 설치됩니다. 라이브러리는 CMAKE를 사용하여 수동으로 설치할 수도 있습니다.
cmake에서 linq를 소비하기 위해 find_package(Linq) 도 사용할 수 있습니다.
find_package(Linq)
target_linkq_libraries(yourLib linq::linq)
전체 지원을 위해서는 Clang 또는 GCC가 필요하며 부스트가 필요합니다. Visual Studio에 대한 부분적인 지원이 있습니다. Visual Studio는 default_if_empty , group_by , group_join , join , order_by , select_many 및 then_by 확장을 지원하지 않으며 Clauses에서 orderby , group 및 중첩을 지원하지 않습니다. 아마도 일부 Visual Studio Wizards는 MSVC 버그를위한 해결 방법을 찾는 데 도움이 될 수 있습니다.
다수 from 명령문은 중첩 된 람다를 사용하여 구현됩니다. 그러나 MSVC 2010의 버그로 인해 중첩 된 람바는 작동하지 않습니다 (이것은 MSVC 2012에서 수정되어야하지만 테스트하지 않았습니다). C ++에서 투명한 식별자를 구현하는 방법이있는 경우 중첩 된 람다를 피할 수 있습니다.
또한 let 와 join 는 아직 지원되지 않습니다. Polymorhpic lambdas의 도움 없이는 into 절을 뒷받침 할 수 없습니다.
BSL-1.0