如今在c++中linq已經有了眾多實現,其中實現度最高,更新最及時,文件最完整的當推linq for c++ (cpplinq)。
以下的示例**使用c++14再現了cpplinq的主要實現技巧。
#include #include templatestruct from_range
// range介面的成員方法
// 過載》操作符,該操作符接收乙個build物件作為右操作符
// 該操作符將自身傳給builder物件的build方法,通過呼叫該方法實現對range的轉換
templatedecltype(auto) operator>>(trangebuilder builder) const
// front方法,返回當前迭代器所指向的資料,即當前資料
decltype(auto) front() const
// next方法,當前資料不存在則返回false,若存在則準備當前資料並返回true
// 具體實現為
// 1. 若其次迭代器與末尾迭代器的值相等,則其次迭代器已經指向容器末尾
// 判斷當前資料不存在,返回false
// 2. 若其次迭代器與末尾迭代器的值不等,則其次迭代器尚未指向容器末尾
// 將其次迭代器的值賦予當前迭代器,遞增其次迭代器,令其指向下乙個資料
// 判斷當前資料存在,返回true
bool next()
};templatestruct where_range
// range介面的成員方法
// 過載》操作符,該操作符接收乙個build物件作為右操作符
// 該操作符將自身傳給builder物件的build方法,通過呼叫該方法實現對range的轉換
templatedecltype(auto) operator>>(trangebuilder builder) const
// front方法,返回轉換源range的當前資料
decltype(auto) front() const
// next方法,當前資料不存在則返回false,若存在則準備當前資料並返回true
// 具體實現為
// 掃瞄資料來源range直至找到符合過濾條件的下乙個資料
// 若該資料存在,則當前資料存在,返回true
// 否則當前資料不存在,返回false
bool next()
};templatestruct where_builder
// builder介面的成員方法
// build方法,生成並返回where_range物件
templateauto build(trange range)
};struct to_vector_builder
};// linq操作符from,將c++容器轉換成from_range物件
templateauto from(tcontainer const& container)
// linq操作符where,生成並返回where_builder物件
templateauto where(tpredicate predicate)
// linq操作符to_vector,生成並返回to_vector_builder物件
auto to_vector()
int main()
; // 找出陣列a中所有的偶數,將結果存放到乙個vector物件中
auto v = from(a) >> where((int n)) >> to_vector();
for(int i : v) std::cout << i << std::endl;}/*
24*/
示例**總共實現了cpplinq中的三個linq操作符from,where以及to_vector。
range和builder是cpplinq的兩種基本元素。
range是cpplinq中的資料結構類,內部包含實際資料或者指向實際資料的迭代器。
builder是cpplinq中的行為類,內部的build方法用於實現對range的轉換。
典型用例分析
from_range >> where_builder >> to_vector_builder
示例**分析
auto v = from(a) >> where((int n)) >> to_vector();
cpplinq中所有的range類都實現了range介面。
range介面由乙個成員型別和三個成員方法組成。
/// range介面
struct ***_range
// front方法,返回當前資料
decltype(auto) front() const
// next方法,若當前資料不存在則返回false,若存在則準備當前資料並返回true
bool next()
};
cpplinq中所有的builder類都實現了builder介面。
builder介面只包含乙個成員方法。
/// builder介面
struct ***_builder
};
下面讓我們來實現linq操作符select。
select操作符生成select_builder物件,該物件負責將range轉換為select_range。
templatestruct select_range
// range介面的成員方法
// 過載》操作符,該操作符接收乙個build物件作為右操作符
// 該操作符將自身傳給builder物件的build方法,通過呼叫該方法實現對range的轉換
templatedecltype(auto) operator>>(trangebuilder builder) const
// front方法,返回對轉換源range的當前資料進行對映後的結果
decltype(auto) front() const
// next方法,當前資料不存在則返回false,若存在則準備當前資料並返回true
// 具體實現為
// 呼叫資料來源range的next方法
bool next()
};templatestruct select_builder
// builder介面的成員方法
// build方法,生成並返回select_range物件
templateauto build(trange range)
};// linq操作符select,生成並返回select_builder物件
templateauto select(tselector selector)
改寫main函式以便測試select操作符。
int main()
; // 找出陣列a中所有的偶數,乘以2,將結果存放到乙個vector物件中
auto v = from(a) >> where((int n)) >> select((int n)) >> to_vector();
for(int i : v) std::cout << i << std::endl;}/*
48*/
C 14嘗鮮 函式返回型別自動推導
函式返回型別自動推導是指c 11以及c 14中不直接給出函式返回型別,而是使用型別指示符來指示返回型別甚至徹底省略返回型別並最終由編譯器來推導返回型別的語言特性。函式返回型別自動推導原則如下 當lambda表示式中省略返回型別時,lambda表示式的返回型別由編譯器根據返回值以及模板引數推導規則進行...
C 1 4次課程複習
c 第一次課程 1.c語言是面向過程的程式設計模式,核心是以函式為模組.物件導向引入了新的概念,可以更好地模擬現實世界,從而提高構建複雜系統的能力.c 第二次課程 1.函式概念複習 函式定義,函式宣告,函式的呼叫,函式的引數 形參,實參 函式引數傳遞的重要原則 函式的引數傳遞是單向的,實參的值傳遞給...
C 14新特性總結
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!c 14這一繼c 11之後的新的c 標準已經被正式批准,正在向iso提交,將於年內發布。c 之父bjarne stroustrup說道,儘管與c 11相比,c 14的改進 有意做的比較小 但是仍然為使用者 帶來了極大的方便 是實現使c 對新手更為友...