{"id":1375,"date":"2012-10-24T08:30:19","date_gmt":"2012-10-24T06:30:19","guid":{"rendered":"http:\/\/mariusbancila.ro\/blog\/?p=1375"},"modified":"2012-11-23T12:55:37","modified_gmt":"2012-11-23T10:55:37","slug":"cpplinq-an-introduction","status":"publish","type":"post","link":"https:\/\/mariusbancila.ro\/blog\/2012\/10\/24\/cpplinq-an-introduction\/","title":{"rendered":"cpplinq: An introduction"},"content":{"rendered":"<p><a href=\"http:\/\/cpplinq.codeplex.com\/\">cpplinq<\/a> is a C++ template library that provides .NET-like query operators for sequences of objects in C++11. cpplinq is an open-source library that works both with VC++ compilers (2010 and 2012) and gcc (4.7.0 is the version used for unit tests). The library supports most of the .NET query operators and is extendable with additional operators that can suite some particular use. If you&#8217;re not familiar with .NET query operators, this article, <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/bb394939.aspx\">http:\/\/msdn.microsoft.com\/en-us\/library\/bb394939.aspx<\/a>, lists and explain them. <\/p>\n<p>The light-weighted library consists of a series of template classes and helper methods, provided in a single header under the namespace cpplinq. <\/p>\n<p>This is a short introduction to the library. More posts will follow. Let&#8217;s see some examples.<\/p>\n<p>The following code retrieves all the prime numbers from an array.<\/p>\n<pre class=\"cpp\" name=\"code\">\r\nauto is_prime = [](int i) -> bool \r\n{\r\n    if (i < 2) { return false; }\r\n    else if (i == 2) { return true; }\r\n    else\r\n    {\r\n        auto r = (int)std::ceil (std::sqrt (i));\r\n        for (auto iter = 2; iter <= r; ++iter)\r\n        {\r\n            if (i % iter == 0) { return false; }\r\n        }\r\n        return true;\r\n    }\r\n};\r\n\r\nint numbers[] = {1,2,3,4,5,6,7,8,9};\r\nauto primes = from_array(numbers)\r\n           >> where(is_prime)\r\n           >> to_vector(); \/\/ yields {2,3,5,7}\r\n<\/pre>\n<p>A slightly variation produces a sequence of first N prime numbers and transforms them into strings.<\/p>\n<pre class=\"cpp\" name=\"code\">\r\nstd::vector&lt;string&gt; primes_as_strings(int n)\r\n{\r\n    auto primes = range(0, INT_MAX)\r\n               >> where(is_prime)\r\n               >> take(n)\r\n               >> select([](int i) {std::stringstream s; s << i; return s.str();})\r\n               >> to_vector();\r\n\r\n   return primes;\r\n}\r\n<\/pre>\n<p>The next sample retrieves all the orders from a customer.<\/p>\n<pre class=\"cpp\" name=\"code\">\r\nstruct order \r\n{\r\n    std::size_t id;\r\n    std::size_t customer_id;\r\n    time_t      date;\r\n\r\n    order(std::size_t id, std::size_t cid, time_t date):\r\n        id(id), customer_id(cid), date(date)\r\n    {\r\n    }\r\n};\r\n\r\nstruct order_line \r\n{\r\n    std::size_t id;\r\n    std::size_t order_id;\r\n    std::size_t article_id;\r\n    double      quantity;\r\n\r\n    order_line(std::size_t id, std::size_t oid, std::size_t aid, double quantity):\r\n        id(id), order_id(oid), article_id(aid), quantity(quantity)\r\n    {\r\n    }\r\n};\r\n\r\norder orders[] = \r\n{\r\n    order(1, 1, time(NULL)),\r\n    order(2, 2, time(NULL)),\r\n    order(3, 1, time(NULL)),\r\n};\r\n\r\norder_line orderlines [] = \r\n{\r\n    order_line(1, 1, 100, 1.0),\r\n    order_line(2, 1, 101, 5.0),\r\n    order_line(3, 1, 102, 2.0),\r\n    order_line(4, 2, 400, 1.0),\r\n    order_line(5, 3, 401, 1.0),\r\n};\r\n\r\nvoid print_orders_by_cust(std::size_t custid)\r\n{\r\n    auto result = from_array(orders)\r\n               >> where([=](order const & o) {return o.customer_id == custid;})\r\n               >> join(from_array(orderlines),\r\n                        [](order const & o) {return o.id;},\r\n                        [](order_line const & ol) {return ol.order_id;},\r\n                        [](order const & o, order_line const & ol) {return std::make_pair(o, ol);});\r\n\r\n    result >> for_each([](std::pair&lt;order, order_line&gt; const & p){\r\n        std::cout << \"order=\" << p.first.id << \", \" << ctime(&#038;(p.first.date)) \r\n                  << \"  article=\" << p.second.article_id << \", quantity=\" << p.second.quantity << std::endl; \r\n    });\r\n}\r\n<\/pre>\n<p>Callinq print_orders_by_cust() with argument 1 would print:<\/p>\n<pre>\r\norder=1, Tue Oct 23 19:22:14 2012\r\n  article=100, quantity=1\r\norder=1, Tue Oct 23 19:22:14 2012\r\n  article=101, quantity=5\r\norder=1, Tue Oct 23 19:22:14 2012\r\n  article=102, quantity=2\r\norder=3, Tue Oct 23 19:23:22 2012\r\n  article=401, quantity=1\r\n<\/pre>\n<p>On the other hand, if you want to print the last order from a particular customer, the function above would change to something like this:<\/p>\n<pre class=\"cpp\" name=\"code\">\r\nvoid print_last_order_for_customer(std::size_t custid)\r\n{\r\n    auto result = from_array(orders)\r\n               >> where([=](order const & o) {return o.customer_id == custid;})\r\n               >> orderby_descending([](order const & o) {return o.date;})\r\n               >> take(1)\r\n               >> join(from_array(orderlines),\r\n                        [](order const & o) {return o.id;},\r\n                        [](order_line const & ol) {return ol.order_id;},\r\n                        [](order const & o, order_line const & ol) {return std::make_pair(o, ol);});\r\n\r\n    result >> for_each([](std::pair&lt;order, order_line&gt; const & p){\r\n        std::cout << \"order=\" << p.first.id << \", \" << ctime(&#038;(p.first.date)) \r\n                  << \"  article=\" << p.second.article_id << \", quantity=\" << p.second.quantity << std::endl; \r\n    });\r\n}\r\n<\/pre>\n<p>Calling print_last_order_for_customer() with argument 1 would print:<\/p>\n<pre>\r\norder=3, Tue Oct 23 19:23:22 2012\r\n  article=401, quantity=1\r\n<\/pre>\n<p>Hopefully this provides a quick view over the capabilities of the library. In following posts I will show more examples and discuss some of the query operators. To learn more about the library see the following articles:<\/p>\n<ul>\n<li><a href=\"http:\/\/cpplinq.codeplex.com\/wikipage?title=Comparison%20to%20the%20.NET%20Standard%20Query%20Operators&#038;referringTitle=Documentation\">Comparison to the .NET Standard Query Operators<\/a><\/li>\n<li><a href=\"http:\/\/cpplinq.codeplex.com\/wikipage?title=Cpplinq%20Query%20Operators&#038;referringTitle=Documentation\">Cpplinq Query Operators<\/a><\/li>\n<\/ul>\n<p><a href=\"http:\/\/www.codeproject.com\/script\/Articles\/BlogArticleList.aspx?amid=562357\" rel=\"tag\" style=\"display:none\">CodeProject<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>cpplinq is a C++ template library that provides .NET-like query operators for sequences of objects in C++11. cpplinq is an open-source library that works both with VC++ compilers (2010 and 2012) and gcc (4.7.0 is the version used for unit tests). The library supports most of the .NET query operators and is extendable with additional &#8230; <a title=\"cpplinq: An introduction\" class=\"read-more\" href=\"https:\/\/mariusbancila.ro\/blog\/2012\/10\/24\/cpplinq-an-introduction\/\" aria-label=\"Read more about cpplinq: An introduction\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[7],"tags":[451,327,138,328,253,105],"class_list":["post-1375","post","type-post","status-publish","format-standard","hentry","category-c","tag-c","tag-cpplinq","tag-library","tag-linq-2","tag-query","tag-template"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"cpplinq is a template library that provides .NET-like query operators to sequences in C++11.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Marius Bancila\"\/>\n\t<meta name=\"keywords\" content=\"cpplinq,linq,library,c++,template,query\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/mariusbancila.ro\/blog\/2012\/10\/24\/cpplinq-an-introduction\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Marius Bancila&#039;s Blog | About code. Mostly on C++\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"cpplinq: An introduction\" \/>\n\t\t<meta property=\"og:description\" content=\"cpplinq is a template library that provides .NET-like query operators to sequences in C++11.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mariusbancila.ro\/blog\/2012\/10\/24\/cpplinq-an-introduction\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2012-10-24T06:30:19+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2012-11-23T10:55:37+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"cpplinq: An introduction\" \/>\n\t\t<meta name=\"twitter:description\" content=\"cpplinq is a template library that provides .NET-like query operators to sequences in C++11.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2012\\\/10\\\/24\\\/cpplinq-an-introduction\\\/#article\",\"name\":\"cpplinq: An introduction\",\"headline\":\"cpplinq: An introduction\",\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"},\"datePublished\":\"2012-10-24T08:30:19+02:00\",\"dateModified\":\"2012-11-23T12:55:37+02:00\",\"inLanguage\":\"en-US\",\"commentCount\":2,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2012\\\/10\\\/24\\\/cpplinq-an-introduction\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2012\\\/10\\\/24\\\/cpplinq-an-introduction\\\/#webpage\"},\"articleSection\":\"C++, C++, cpplinq, library, linq, query, template\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2012\\\/10\\\/24\\\/cpplinq-an-introduction\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"position\":2,\"name\":\"IT\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"position\":3,\"name\":\"Software\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"position\":4,\"name\":\"C++\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2012\\\/10\\\/24\\\/cpplinq-an-introduction\\\/#listItem\",\"name\":\"cpplinq: An introduction\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2012\\\/10\\\/24\\\/cpplinq-an-introduction\\\/#listItem\",\"position\":5,\"name\":\"cpplinq: An introduction\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"Marius Bancila\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2012\\\/10\\\/24\\\/cpplinq-an-introduction\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Marius Bancila\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2012\\\/10\\\/24\\\/cpplinq-an-introduction\\\/#webpage\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2012\\\/10\\\/24\\\/cpplinq-an-introduction\\\/\",\"name\":\"cpplinq: An introduction\",\"description\":\"cpplinq is a template library that provides .NET-like query operators to sequences in C++11.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2012\\\/10\\\/24\\\/cpplinq-an-introduction\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2012-10-24T08:30:19+02:00\",\"dateModified\":\"2012-11-23T12:55:37+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"cpplinq: An introduction","description":"cpplinq is a template library that provides .NET-like query operators to sequences in C++11.","canonical_url":"https:\/\/mariusbancila.ro\/blog\/2012\/10\/24\/cpplinq-an-introduction\/","robots":"max-image-preview:large","keywords":"cpplinq,linq,library,c++,template,query","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/mariusbancila.ro\/blog\/2012\/10\/24\/cpplinq-an-introduction\/#article","name":"cpplinq: An introduction","headline":"cpplinq: An introduction","author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"},"datePublished":"2012-10-24T08:30:19+02:00","dateModified":"2012-11-23T12:55:37+02:00","inLanguage":"en-US","commentCount":2,"mainEntityOfPage":{"@id":"https:\/\/mariusbancila.ro\/blog\/2012\/10\/24\/cpplinq-an-introduction\/#webpage"},"isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/2012\/10\/24\/cpplinq-an-introduction\/#webpage"},"articleSection":"C++, C++, cpplinq, library, linq, query, template"},{"@type":"BreadcrumbList","@id":"https:\/\/mariusbancila.ro\/blog\/2012\/10\/24\/cpplinq-an-introduction\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","position":1,"name":"Home","item":"https:\/\/mariusbancila.ro\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","position":2,"name":"IT","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","position":3,"name":"Software","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","position":4,"name":"C++","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2012\/10\/24\/cpplinq-an-introduction\/#listItem","name":"cpplinq: An introduction"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2012\/10\/24\/cpplinq-an-introduction\/#listItem","position":5,"name":"cpplinq: An introduction","previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"}}]},{"@type":"Organization","@id":"https:\/\/mariusbancila.ro\/blog\/#organization","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","url":"https:\/\/mariusbancila.ro\/blog\/"},{"@type":"Person","@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author","url":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/","name":"Marius Bancila","image":{"@type":"ImageObject","@id":"https:\/\/mariusbancila.ro\/blog\/2012\/10\/24\/cpplinq-an-introduction\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g","width":96,"height":96,"caption":"Marius Bancila"}},{"@type":"WebPage","@id":"https:\/\/mariusbancila.ro\/blog\/2012\/10\/24\/cpplinq-an-introduction\/#webpage","url":"https:\/\/mariusbancila.ro\/blog\/2012\/10\/24\/cpplinq-an-introduction\/","name":"cpplinq: An introduction","description":"cpplinq is a template library that provides .NET-like query operators to sequences in C++11.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/mariusbancila.ro\/blog\/2012\/10\/24\/cpplinq-an-introduction\/#breadcrumblist"},"author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"datePublished":"2012-10-24T08:30:19+02:00","dateModified":"2012-11-23T12:55:37+02:00"},{"@type":"WebSite","@id":"https:\/\/mariusbancila.ro\/blog\/#website","url":"https:\/\/mariusbancila.ro\/blog\/","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","inLanguage":"en-US","publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Marius Bancila's Blog | About code. Mostly on C++","og:type":"article","og:title":"cpplinq: An introduction","og:description":"cpplinq is a template library that provides .NET-like query operators to sequences in C++11.","og:url":"https:\/\/mariusbancila.ro\/blog\/2012\/10\/24\/cpplinq-an-introduction\/","article:published_time":"2012-10-24T06:30:19+00:00","article:modified_time":"2012-11-23T10:55:37+00:00","twitter:card":"summary","twitter:title":"cpplinq: An introduction","twitter:description":"cpplinq is a template library that provides .NET-like query operators to sequences in C++11."},"aioseo_meta_data":{"post_id":"1375","title":"cpplinq: An introduction","description":"cpplinq is a template library that provides .NET-like query operators to sequences in C++11.","keywords":[{"label":"cpplinq","value":"cpplinq"},{"label":"linq","value":"linq"},{"label":"library","value":"library"},{"label":"c++","value":"c++"},{"label":"template","value":"template"},{"label":"query","value":"query"}],"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-03-18 21:12:20","updated":"2025-12-12 07:38:19","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"author_meta":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"featured_img":null,"jetpack_publicize_connections":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"uagb_comment_info":2,"uagb_excerpt":"cpplinq is a C++ template library that provides .NET-like query operators for sequences of objects in C++11. cpplinq is an open-source library that works both with VC++ compilers (2010 and 2012) and gcc (4.7.0 is the version used for unit tests). The library supports most of the .NET query operators and is extendable with additional&hellip;","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">C++<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">C++<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">C++<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">cpplinq<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">library<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">linq<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">query<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">template<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">C++<\/span>","<span class=\"advgb-post-tax-term\">cpplinq<\/span>","<span class=\"advgb-post-tax-term\">library<\/span>","<span class=\"advgb-post-tax-term\">linq<\/span>","<span class=\"advgb-post-tax-term\">query<\/span>","<span class=\"advgb-post-tax-term\">template<\/span>"]}},"comment_count":"2","relative_dates":{"created":"Posted 14 years ago","modified":"Updated 14 years ago"},"absolute_dates":{"created":"Posted on October 24, 2012","modified":"Updated on November 23, 2012"},"absolute_dates_time":{"created":"Posted on October 24, 2012 8:30 am","modified":"Updated on November 23, 2012 12:55 pm"},"featured_img_caption":"","series_order":"","jetpack_shortlink":"https:\/\/wp.me\/pYNdv-mb","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/1375","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/comments?post=1375"}],"version-history":[{"count":14,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/1375\/revisions"}],"predecessor-version":[{"id":1403,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/1375\/revisions\/1403"}],"wp:attachment":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/media?parent=1375"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/categories?post=1375"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/tags?post=1375"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}