{"id":2273,"date":"2016-09-12T13:26:15","date_gmt":"2016-09-12T11:26:15","guid":{"rendered":"http:\/\/mariusbancila.ro\/blog\/?p=2273"},"modified":"2016-09-12T13:26:15","modified_gmt":"2016-09-12T11:26:15","slug":"a-comparison-of-two-stdtransform-alternatives-revisited","status":"publish","type":"post","link":"https:\/\/mariusbancila.ro\/blog\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/","title":{"rendered":"A comparison of two std::transform alternatives revisited"},"content":{"rendered":"<p>In the <a href=\"http:\/\/mariusbancila.ro\/blog\/2016\/09\/07\/a-comparison-of-two-stdtransform-alternatives\/\">previous post<\/a> I have compared two alternative ways of transforming a string to upper case, both using <tt>std::transform<\/tt>: one that modifies an existing string and one that generates a new one by inserting at the end using <tt>std::back_inserter<\/tt>. For the second alternative I have presented two implementations, one that does an initial reservation for the newly created string and one that does not.<\/p>\n<pre class=\"lang:default decode:true \" >inline std::string to_upper_v2(std::string const &amp; text)\r\n{\r\n  auto uppertext = std::string{};\r\n  std::transform(std::begin(text), std::end(text), std::back_inserter(uppertext), toupper);\r\n  return uppertext;\r\n}\r\n \r\ninline std::string to_upper_v3(std::string const &amp; text)\r\n{\r\n   auto uppertext = std::string{};\r\n   uppertext.reserve(text.size());\r\n   std::transform(std::begin(text), std::end(text), std::back_inserter(uppertext), toupper);\r\n   return uppertext;\r\n}<\/pre>\n<p>The curious conclusion of the tests was that the version with reserve was actually slower than the one that did not perform an initial reservation.<\/p>\n<p>The solution was built with Visual Studio 2015 Update 2. As it was later noticed in the comments, the actual cause of that is a Microsoft optimization for <tt>std::string<\/tt> by using an array of 16 characters for strings that do not exceed this size and only dynamically allocate memory for larger strings. Since all the strings had a length between 3 and 12 characters, this optimization was used for all strings. Therefore, <tt>reserve()<\/tt> dynamically allocated memory that was never used and its execution time only added to the overall time.<\/p>\n<p>To actually be able to test the performance of these two implementations with VC++, the strings should be larger than 16 characters. So I changed the code to generate strings between 17 and 25 characters long.<\/p>\n<pre class=\"lang:default decode:true \" >auto dist_len = std::uniform_int_distribution&lt;&gt;{ 3, 12 };<\/pre>\n<p>The results this time were totally different. The 3rd version with initial reserving was more performant than the one that did not do that. It can also be noticed that the more strings need to be transformed the more similar times it takes for all the versions.<\/p>\n<table border=\"1\">\n<thead>\n<td>No of strings<\/td>\n<td>time v1<\/td>\n<td>time v2<\/td>\n<td>time v3<\/td>\n<td>Percentage of slowdown with v2<\/td>\n<td>Percentage of slowdown with v3<\/td>\n<\/thead>\n<tbody>\n<tr>\n<td>1000<\/td>\n<td>122<\/td>\n<td>219<\/td>\n<td>205<\/td>\n<td>79.5<\/td>\n<td>68.0<\/td>\n<\/tr>\n<tr>\n<td>10000<\/td>\n<td>1202<\/td>\n<td>2178<\/td>\n<td>2055<\/td>\n<td>81.2<\/td>\n<td>71.0<\/td>\n<\/tr>\n<tr>\n<td>100000<\/td>\n<td>13563<\/td>\n<td>22758<\/td>\n<td>21431<\/td>\n<td>67.8<\/td>\n<td>58.0<\/td>\n<\/tr>\n<tr>\n<td>1000000<\/td>\n<td>136160<\/td>\n<td>225669<\/td>\n<td>214149<\/td>\n<td>65.7<\/td>\n<td>57.3<\/td>\n<\/tr>\n<tr>\n<td>10000000<\/td>\n<td>1368034<\/td>\n<td>2268991<\/td>\n<td>2155969<\/td>\n<td>65.9<\/td>\n<td>57.6<\/td>\n<\/tr>\n<tr>\n<td>100000000<\/td>\n<td>23090172<\/td>\n<td>27997658<\/td>\n<td>27322888<\/td>\n<td>21.3<\/td>\n<td>18.3<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>In the chart below with blue it is represented the results for version 2 and with orange the results for version 3 (with initial reservation).<br \/>\n<a href=\"http:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2016\/09\/transform2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2016\/09\/transform2.png\" alt=\"transform2\" width=\"478\" height=\"574\" class=\"alignnone size-full wp-image-2274\" srcset=\"https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2016\/09\/transform2.png 478w, https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2016\/09\/transform2-250x300.png 250w\" sizes=\"auto, (max-width: 478px) 100vw, 478px\" \/><\/a><\/p>\n<p><b>Note<\/b>: Generating 100 milion strings between 17 and 25 characters require a lot of memory. In my tests it peaked to 13GB. So if you want to run the code you should be aware of this.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the previous post I have compared two alternative ways of transforming a string to upper case, both using std::transform: one that modifies an existing string and one that generates a new one by inserting at the end using std::back_inserter. For the second alternative I have presented two implementations, one that does an initial reservation &#8230; <a title=\"A comparison of two std::transform alternatives revisited\" class=\"read-more\" href=\"https:\/\/mariusbancila.ro\/blog\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/\" aria-label=\"Read more about A comparison of two std::transform alternatives revisited\">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":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":[7],"tags":[485,486,451,487],"class_list":["post-2273","post","type-post","status-publish","format-standard","hentry","category-c","tag-algorithm","tag-back_inserter","tag-c","tag-transform"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Marius Bancila\"\/>\n\t<meta name=\"keywords\" content=\"algorithm,back_inserter,c++,transform\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/mariusbancila.ro\/blog\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\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=\"A comparison of two std::transform alternatives revisited\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mariusbancila.ro\/blog\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2016-09-12T11:26:15+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2016-09-12T11:26:15+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"A comparison of two std::transform alternatives revisited\" \/>\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\\\/2016\\\/09\\\/12\\\/a-comparison-of-two-stdtransform-alternatives-revisited\\\/#article\",\"name\":\"A comparison of two std::transform alternatives revisited\",\"headline\":\"A comparison of two std::transform alternatives revisited\",\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/wp-content\\\/uploads\\\/2016\\\/09\\\/transform2.png\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/09\\\/12\\\/a-comparison-of-two-stdtransform-alternatives-revisited\\\/#articleImage\",\"width\":478,\"height\":574},\"datePublished\":\"2016-09-12T13:26:15+02:00\",\"dateModified\":\"2016-09-12T13:26:15+02:00\",\"inLanguage\":\"en-US\",\"commentCount\":1,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/09\\\/12\\\/a-comparison-of-two-stdtransform-alternatives-revisited\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/09\\\/12\\\/a-comparison-of-two-stdtransform-alternatives-revisited\\\/#webpage\"},\"articleSection\":\"C++, algorithm, back_inserter, C++, transform\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/09\\\/12\\\/a-comparison-of-two-stdtransform-alternatives-revisited\\\/#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\\\/2016\\\/09\\\/12\\\/a-comparison-of-two-stdtransform-alternatives-revisited\\\/#listItem\",\"name\":\"A comparison of two std::transform alternatives revisited\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/09\\\/12\\\/a-comparison-of-two-stdtransform-alternatives-revisited\\\/#listItem\",\"position\":5,\"name\":\"A comparison of two std::transform alternatives revisited\",\"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\\\/2016\\\/09\\\/12\\\/a-comparison-of-two-stdtransform-alternatives-revisited\\\/#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\\\/2016\\\/09\\\/12\\\/a-comparison-of-two-stdtransform-alternatives-revisited\\\/#webpage\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/09\\\/12\\\/a-comparison-of-two-stdtransform-alternatives-revisited\\\/\",\"name\":\"A comparison of two std::transform alternatives revisited\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2016\\\/09\\\/12\\\/a-comparison-of-two-stdtransform-alternatives-revisited\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2016-09-12T13:26:15+02:00\",\"dateModified\":\"2016-09-12T13:26:15+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":"A comparison of two std::transform alternatives revisited","description":"","canonical_url":"https:\/\/mariusbancila.ro\/blog\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/","robots":"max-image-preview:large","keywords":"algorithm,back_inserter,c++,transform","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/mariusbancila.ro\/blog\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/#article","name":"A comparison of two std::transform alternatives revisited","headline":"A comparison of two std::transform alternatives revisited","author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2016\/09\/transform2.png","@id":"https:\/\/mariusbancila.ro\/blog\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/#articleImage","width":478,"height":574},"datePublished":"2016-09-12T13:26:15+02:00","dateModified":"2016-09-12T13:26:15+02:00","inLanguage":"en-US","commentCount":1,"mainEntityOfPage":{"@id":"https:\/\/mariusbancila.ro\/blog\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/#webpage"},"isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/#webpage"},"articleSection":"C++, algorithm, back_inserter, C++, transform"},{"@type":"BreadcrumbList","@id":"https:\/\/mariusbancila.ro\/blog\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/#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\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/#listItem","name":"A comparison of two std::transform alternatives revisited"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/#listItem","position":5,"name":"A comparison of two std::transform alternatives revisited","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\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/#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\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/#webpage","url":"https:\/\/mariusbancila.ro\/blog\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/","name":"A comparison of two std::transform alternatives revisited","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/mariusbancila.ro\/blog\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/#breadcrumblist"},"author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"datePublished":"2016-09-12T13:26:15+02:00","dateModified":"2016-09-12T13:26:15+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":"A comparison of two std::transform alternatives revisited","og:url":"https:\/\/mariusbancila.ro\/blog\/2016\/09\/12\/a-comparison-of-two-stdtransform-alternatives-revisited\/","article:published_time":"2016-09-12T11:26:15+00:00","article:modified_time":"2016-09-12T11:26:15+00:00","twitter:card":"summary","twitter:title":"A comparison of two std::transform alternatives revisited"},"aioseo_meta_data":{"post_id":"2273","title":null,"description":null,"keywords":null,"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":"","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:07:10","updated":"2025-12-12 07:43:26","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":1,"uagb_excerpt":"In the previous post I have compared two alternative ways of transforming a string to upper case, both using std::transform: one that modifies an existing string and one that generates a new one by inserting at the end using std::back_inserter. For the second alternative I have presented two implementations, one that does an initial reservation&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\">algorithm<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">back_inserter<\/a>","<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\">transform<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">algorithm<\/span>","<span class=\"advgb-post-tax-term\">back_inserter<\/span>","<span class=\"advgb-post-tax-term\">C++<\/span>","<span class=\"advgb-post-tax-term\">transform<\/span>"]}},"comment_count":"1","relative_dates":{"created":"Posted 10 years ago","modified":"Updated 10 years ago"},"absolute_dates":{"created":"Posted on September 12, 2016","modified":"Updated on September 12, 2016"},"absolute_dates_time":{"created":"Posted on September 12, 2016 1:26 pm","modified":"Updated on September 12, 2016 1:26 pm"},"featured_img_caption":"","series_order":"","jetpack_shortlink":"https:\/\/wp.me\/pYNdv-AF","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/2273","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=2273"}],"version-history":[{"count":4,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/2273\/revisions"}],"predecessor-version":[{"id":2278,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/2273\/revisions\/2278"}],"wp:attachment":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/media?parent=2273"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/categories?post=2273"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/tags?post=2273"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}