{"id":4455,"date":"2022-03-16T10:55:58","date_gmt":"2022-03-16T08:55:58","guid":{"rendered":"https:\/\/mariusbancila.ro\/blog\/?p=4455"},"modified":"2022-03-16T10:58:47","modified_gmt":"2022-03-16T08:58:47","slug":"new-cpp23-range-adaptors","status":"publish","type":"post","link":"https:\/\/mariusbancila.ro\/blog\/2022\/03\/16\/new-cpp23-range-adaptors\/","title":{"rendered":"New C++23 range adaptors"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The C++23 standard provides several new range adaptors in the ranges library. These include <code>join_with<\/code>, <code>zip<\/code>, and <code>zip_transform<\/code>. In this post, I will briefly show how these should work.<\/p>\n\n\n\n<!--more-->\n\n\n\n<div class=\"wp-block-uagb-inline-notice uagb-inline_notice__outer-wrap uagb-inline_notice__align-left uagb-block-1829aca0\"><h4 class=\"uagb-notice-title\">Note<\/h4><div class=\"uagb-notice-text\"><p>Keep in mind though that no compiler supports these adaptors at this moment, so the code presented here in untested.<\/p><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Joining<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In C++20, there is an adaptor called <code><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/ranges\/join_view\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"join_view\">join_view<\/a><\/code>. This flattens a range of ranges of <code>T<\/code> into a range of <code>T<\/code>. Here is an example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using namespace std::ranges;\n\nauto l_as_string = []&lt;typename R>(R range){\n   return std::string(std::begin(range), std::end(range));\n};\n\nstd::vector&lt;std::string> words{\"this\", \"is\", \"a\", \"demo\"};\nauto text = l_as_string(words | views::join);\nstd::cout &lt;&lt; text &lt;&lt; '\\n';<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The text variable contains the <code>\"thisisademo\"<\/code> string. Which is what you would need in various scenarios. But what if you actually need to include some separated between each range. For instance, what if you want the result to be <code>\"this is a demo\"<\/code>?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You ca solve this with <code><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/ranges\/join_with_view\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"join_with_view\">join_with_view<\/a><\/code> in C++23. The change is minimal, as show in the following snippet:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">auto text = l_as_string(words | views::join_with(' '));<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Zipping<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zipping is the process of talking one element at a time from two or more ranges and creating a new range of tuples from those elements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Some people assume that zipping create a new range that intercalates elements, such as in the following example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">R1: {1, 2, 3, 4}\nR2: {10, 20}\nR3: {100, 200, 300}\nzip(R1, R2, R3): {1,10,100,2,20,200}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is incorrect. Zipping creates tuples as conceptually shown here:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">R1: {1, 2, 3, 4}\nR2: {10, 20}\nR3: {100, 200, 300}\nzip(R1, R2, R3): {(1,10,100),(2,20,200)}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is possible in C++23 with the <code><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/ranges\/zip_view\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"zip_view\">zip_view<\/a><\/code> adaptor. Let&#8217;s take an example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">std::array&lt;int, 4> n{ 1, 2, 3, 4 };\nstd::vector&lt;std::string> w{ \"one\",\"two\",\"three\" };\n\nauto z1 = views::zip(n, w) \/\/ { (1, \"one\"), (2, \"two\"), (3, \"three\") }\n\nfor(auto t : z1)\n   std::cout &lt;&lt; std::get&lt;0>(t) &lt;&lt; '-' \n             &lt;&lt; std::get&lt;1>(t) &lt;&lt; '\\n';<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The result of zipping an array of integers and a vector of strings is a view of <code>tuple&lt;int&amp;, string&amp;&gt;<\/code>. We can use <code>std::get<\/code> to fetch the value of each element of the tuple.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sometimes you might want to perform a transformation on the zipped values. For instance adding or concatenating them. In this case, the result is not a view of tuples, but a view of <code>T<\/code>s. Here is a conceptual example where elements are added together producing a range of integers:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">R1: {1, 2, 3, 4}\nR2: {10, 20}\nR3: {100, 200, 300}\nzip_transform(+, R1, R2, R3): {111,222}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This operation is supported by the <code><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/ranges\/zip_transform_view\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"zip_transform_view\">zip_transform_view<\/a><\/code> adaptor in C++23. This is similar to <code>zip_view<\/code> except that its first parameter is a callable object (such as a function, a functor, or a lambda expression). Here is an example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">auto l_concat = [](int n, std::string const&amp; s) {\n   return std::to_string(n) + \"-\" + s;\n};\n\nauto z2 = views::zip_transform(l_concat, n, w); \/\/ {\"1-one\", \"2-two\", \"3-three\"}\nfor (auto e : z2) \n   std::cout &lt;&lt; e &lt;&lt; '\\n';<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">References<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2021\/p2321r2.html\" target=\"_blank\" rel=\"noreferrer noopener\">P2321: zip<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2022\/p2441r2.html\" target=\"_blank\" rel=\"noreferrer noopener\">P2441: views::join_with<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The C++23 standard provides several new range adaptors in the ranges library. These include join_with, zip, and zip_transform. In this post, I will briefly show how these should work.<\/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":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-4455","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"A look at the new C++23 join_with, zip, and zip_transform range adaptors.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Marius Bancila\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/mariusbancila.ro\/blog\/2022\/03\/16\/new-cpp23-range-adaptors\/\" \/>\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=\"New C++23 range adaptors\" \/>\n\t\t<meta property=\"og:description\" content=\"A look at the new C++23 join_with, zip, and zip_transform range adaptors.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mariusbancila.ro\/blog\/2022\/03\/16\/new-cpp23-range-adaptors\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2022-03-16T08:55:58+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2022-03-16T08:58:47+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"New C++23 range adaptors\" \/>\n\t\t<meta name=\"twitter:description\" content=\"A look at the new C++23 join_with, zip, and zip_transform range adaptors.\" \/>\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\\\/2022\\\/03\\\/16\\\/new-cpp23-range-adaptors\\\/#article\",\"name\":\"New C++23 range adaptors\",\"headline\":\"New C++23 range adaptors\",\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"},\"datePublished\":\"2022-03-16T10:55:58+02:00\",\"dateModified\":\"2022-03-16T10:58:47+02:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2022\\\/03\\\/16\\\/new-cpp23-range-adaptors\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2022\\\/03\\\/16\\\/new-cpp23-range-adaptors\\\/#webpage\"},\"articleSection\":\"Uncategorized\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2022\\\/03\\\/16\\\/new-cpp23-range-adaptors\\\/#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\\\/uncategorized\\\/#listItem\",\"name\":\"Uncategorized\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/uncategorized\\\/#listItem\",\"position\":2,\"name\":\"Uncategorized\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/uncategorized\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2022\\\/03\\\/16\\\/new-cpp23-range-adaptors\\\/#listItem\",\"name\":\"New C++23 range adaptors\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2022\\\/03\\\/16\\\/new-cpp23-range-adaptors\\\/#listItem\",\"position\":3,\"name\":\"New C++23 range adaptors\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/uncategorized\\\/#listItem\",\"name\":\"Uncategorized\"}}]},{\"@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\\\/2022\\\/03\\\/16\\\/new-cpp23-range-adaptors\\\/#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\\\/2022\\\/03\\\/16\\\/new-cpp23-range-adaptors\\\/#webpage\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2022\\\/03\\\/16\\\/new-cpp23-range-adaptors\\\/\",\"name\":\"New C++23 range adaptors\",\"description\":\"A look at the new C++23 join_with, zip, and zip_transform range adaptors.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2022\\\/03\\\/16\\\/new-cpp23-range-adaptors\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2022-03-16T10:55:58+02:00\",\"dateModified\":\"2022-03-16T10:58:47+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":"New C++23 range adaptors","description":"A look at the new C++23 join_with, zip, and zip_transform range adaptors.","canonical_url":"https:\/\/mariusbancila.ro\/blog\/2022\/03\/16\/new-cpp23-range-adaptors\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/mariusbancila.ro\/blog\/2022\/03\/16\/new-cpp23-range-adaptors\/#article","name":"New C++23 range adaptors","headline":"New C++23 range adaptors","author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"},"datePublished":"2022-03-16T10:55:58+02:00","dateModified":"2022-03-16T10:58:47+02:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/mariusbancila.ro\/blog\/2022\/03\/16\/new-cpp23-range-adaptors\/#webpage"},"isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/2022\/03\/16\/new-cpp23-range-adaptors\/#webpage"},"articleSection":"Uncategorized"},{"@type":"BreadcrumbList","@id":"https:\/\/mariusbancila.ro\/blog\/2022\/03\/16\/new-cpp23-range-adaptors\/#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\/uncategorized\/#listItem","name":"Uncategorized"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/uncategorized\/#listItem","position":2,"name":"Uncategorized","item":"https:\/\/mariusbancila.ro\/blog\/category\/uncategorized\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2022\/03\/16\/new-cpp23-range-adaptors\/#listItem","name":"New C++23 range adaptors"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2022\/03\/16\/new-cpp23-range-adaptors\/#listItem","position":3,"name":"New C++23 range adaptors","previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/uncategorized\/#listItem","name":"Uncategorized"}}]},{"@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\/2022\/03\/16\/new-cpp23-range-adaptors\/#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\/2022\/03\/16\/new-cpp23-range-adaptors\/#webpage","url":"https:\/\/mariusbancila.ro\/blog\/2022\/03\/16\/new-cpp23-range-adaptors\/","name":"New C++23 range adaptors","description":"A look at the new C++23 join_with, zip, and zip_transform range adaptors.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/mariusbancila.ro\/blog\/2022\/03\/16\/new-cpp23-range-adaptors\/#breadcrumblist"},"author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"datePublished":"2022-03-16T10:55:58+02:00","dateModified":"2022-03-16T10:58:47+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":"New C++23 range adaptors","og:description":"A look at the new C++23 join_with, zip, and zip_transform range adaptors.","og:url":"https:\/\/mariusbancila.ro\/blog\/2022\/03\/16\/new-cpp23-range-adaptors\/","article:published_time":"2022-03-16T08:55:58+00:00","article:modified_time":"2022-03-16T08:58:47+00:00","twitter:card":"summary","twitter:title":"New C++23 range adaptors","twitter:description":"A look at the new C++23 join_with, zip, and zip_transform range adaptors."},"aioseo_meta_data":{"post_id":"4455","title":null,"description":"A look at the new C++23 join_with, zip, and zip_transform range adaptors. &nbsp;","keywords":[],"keyphrases":{"focus":[],"additional":[]},"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":"","og_custom_url":null,"og_article_section":null,"og_article_tags":[],"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":{"id":"aioseo-article-6369653d5e9c9","slug":"article","graphName":"Article","label":"Article","properties":{"type":"BlogPosting","name":"#post_title","headline":"#post_title","description":"#post_excerpt","image":"","keywords":"","author":{"name":"#author_name","url":"#author_url"},"dates":{"include":true,"datePublished":"","dateModified":""}}},"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":"{\"article\":{\"articleType\":\"BlogPosting\"},\"course\":{\"name\":\"\",\"description\":\"\",\"provider\":\"\"},\"faq\":{\"pages\":[]},\"product\":{\"reviews\":[]},\"recipe\":{\"ingredients\":[],\"instructions\":[],\"keywords\":[]},\"software\":{\"reviews\":[],\"operatingSystems\":[]},\"webPage\":{\"webPageType\":\"WebPage\"}}","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":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2022-03-16 08:22:34","updated":"2025-12-12 07:57:11","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":0,"uagb_excerpt":"The C++23 standard provides several new range adaptors in the ranges library. These include join_with, zip, and zip_transform. In this post, I will briefly show how these should work.","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/uncategorized\/\" class=\"advgb-post-tax-term\">Uncategorized<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">Uncategorized<\/span>"]}},"comment_count":"0","relative_dates":{"created":"Posted 5 years ago","modified":"Updated 5 years ago"},"absolute_dates":{"created":"Posted on March 16, 2022","modified":"Updated on March 16, 2022"},"absolute_dates_time":{"created":"Posted on March 16, 2022 10:55 am","modified":"Updated on March 16, 2022 10:58 am"},"featured_img_caption":"","series_order":"","jetpack_shortlink":"https:\/\/wp.me\/pYNdv-19R","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/4455","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=4455"}],"version-history":[{"count":5,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/4455\/revisions"}],"predecessor-version":[{"id":4460,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/4455\/revisions\/4460"}],"wp:attachment":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/media?parent=4455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/categories?post=4455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/tags?post=4455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}