{"id":2199,"date":"2021-05-16T20:41:30","date_gmt":"2021-05-16T20:41:30","guid":{"rendered":"https:\/\/www.yazilimperver.com\/?p=2199"},"modified":"2021-05-16T20:41:30","modified_gmt":"2021-05-16T20:41:30","slug":"haftalik-c-38-daha-da-modern-c","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/","title":{"rendered":"Haftal\u0131k C++ 38 &#8211; Daha da Modern C++"},"content":{"rendered":"<p>Haftal\u0131k C++ yaz\u0131lar\u0131m\u0131n bir di\u011feri ile tekrar birlikteyiz, sevgili yaz\u0131l\u0131mperver dostlar\u0131m. Bu \u00e7ok uzun olmayan yaz\u0131m ile birlikte, bir kod par\u00e7as\u0131n\u0131n\/problemin yeni gelen C++ kabiliyetleri ile nas\u0131l geli\u015fti\u011fine, farkl\u0131 perspektiflerden bak\u0131yor olaca\u011f\u0131z.<\/p>\n<p>Bu ba\u011flamda bakaca\u011f\u0131m\u0131z kod par\u00e7as\u0131, &#8220;quicksort&#8221; ile ilgili olacak. &#8220;Quicksort&#8221; &#8216;a ili\u015fkin bir fikriniz yok ise hemen bir g\u00f6z atmak ya da hat\u0131rlamak i\u00e7in, <span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.tutorialspoint.com\/data_structures_algorithms\/quick_sort_algorithm.htm\">\u015fu sayfaya<\/a><\/strong><\/span>, g\u00f6z atabilirsiniz. Asl\u0131na bakarsan\u0131z, ilk C++ s\u00fcr\u00fcmleri (C++ 98), &lt;algorithm&gt; ba\u015fl\u0131k dosyas\u0131 arac\u0131l\u0131\u011f\u0131 ile bu tarz s\u0131ralama API&#8217;leri sunuyorlard\u0131. Bu API&#8217;ler ile birlikte hem dizi hem de konteynerleri s\u0131ralayabiliyorduk:<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;algorithm&gt;\r\n\r\nint vals[] = {5, 10, 0, -5, 42};\r\n\r\n\/\/ \u0130\u015faret\u00e7iler \u00fczerinden, ba\u015flang\u0131\u00e7 ve biti\u015fleri veriyoruz ve k\u00fc\u00e7\u00fckten b\u00fcy\u00fc\u011fe do\u011fru s\u0131ralan\u0131yor\r\nstd::sort(vals, vals + 5);\r\n\r\n\/\/ Konteynerler i\u00e7in de benzer \u015fekilde ilgili iterator'ler ile bunu yapabiliyorduk\r\nstd::vector&lt;int&gt; numbers;\r\n\r\n\/\/ Bu da varsayilan olan k\u00fc\u00e7\u00fckten b\u00fcy\u00fc\u011fe do\u011fru s\u0131ralamakta\r\nstd::sort(numbers.begin(), numbers.end());<\/pre>\n<p>E\u011fer hala C++ 98 kullan\u0131yor, \u00e7ok performans kritik bir ihtiyac\u0131n\u0131z yok ve de tekerle\u011fi ba\u015ftan icat etmek istemiyorsan\u0131z bu API&#8217;yi kullanabilirsiniz. Bu bize ne sa\u011fl\u0131yor:<\/p>\n<ul>\n<li>Kolay ve anla\u015f\u0131l\u0131r kullan\u0131m,<\/li>\n<li>Derleme zaman\u0131 kontroller,<\/li>\n<li><strong>Ortalama<\/strong> O(nlg(n)) karma\u015f\u0131kl\u0131k,<\/li>\n<li>Peki sadece bu s\u0131ralama API&#8217;si mi sunuluyordu, hay\u0131r. A\u015fa\u011f\u0131dakiler de C++ 98 ile sunulan di\u011fer API&#8217;ler\n<ul>\n<li>stable_sort(), partial_sort(), nth_element(), partition(), stable_partition().<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u015eimdi gelelim C++ 11&#8217;e. Daha \u00f6nce sizlerle de i\u015fledi\u011fimiz<span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2020\/10\/04\/haftalik-c-31-stdarray\/\"><strong> <em>std::array<\/em> <\/strong><\/a><\/span>ve <span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2018\/01\/28\/modern-c-3-uniform-initialization-overridefinal-defaultdelete-constexpr-vb\/\"><strong><em>std::initializer_list<\/em> <\/strong><\/a><\/span>ile yukar\u0131daki kodu art\u0131k a\u015fa\u011f\u0131daki gibi yazabiliyoruz.<\/p>\n<pre class=\"lang:c++ decode:true \">#include &lt;algorithm&gt;\r\n\r\nstd::array&lt;int, 5&gt; numbers{5, 10, 0, -5, 42};\r\nstd::sort(numbers.begin(), numbers.end());\r\n\r\nstd::vector&lt;int&gt; numbers{5, 10, 0, -5, 42};\r\nstd::sort(numbers.begin(), numbers.end());<\/pre>\n<p>Asl\u0131na bakarsan\u0131z i\u015flevsel \u00e7ok bir farkl\u0131l\u0131k olmasa da, art\u0131k API&#8217;lerin kullan\u0131m\u0131 ortakland\u0131. Normal diziler yerine, daha \u00f6nce de bahsetti\u011fim gibi, aksi bir ihtiya\u00e7 olmad\u0131\u011f\u0131 m\u00fcddet\u00e7e daha kullan\u0131\u015fl\u0131 olan std::array kullan\u0131m\u0131na ge\u00e7tik ve vekt\u00f6r konteyneri i\u00e7in de tek tek veri eklemek zorunda kalmad\u0131k. Her iki veri yap\u0131s\u0131n\u0131 da <strong>std::initializer_list<\/strong> ile olu\u015fturur olu\u015fturmaz ilklendirebildik. Peki bitti mi?<\/p>\n<p>Elbette hay\u0131r. \u015eimdi C++ 17&#8217;e gelelim. Peki C++ 17 bize ne sa\u011fl\u0131yor. &#8220;<a href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/class_template_argument_deduction\"><span style=\"color: #008000;\"><strong>Class Template Argument Deduction\/CTAD<\/strong><\/span><\/a>&#8221; kabiliyeti ile birlikte (biliyorum bu konuyu hen\u00fcz i\u015flemedik ama art\u0131k i\u015flemek farz oldu \ud83d\ude42 ), template&#8217;lar i\u00e7in tip ve adet bilgisini (yani &#8220;&lt;int&gt;&#8221; ve 5&#8217;i) de yazmam\u0131za gerek kalm\u0131yor (tabi burada tiplerin \u00e7\u0131kar\u0131labiliyor olmas\u0131 laz\u0131m). \u015eimdi ne oldu kodumuz:<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;algorithm&gt;\r\n\r\nstd::array numbers{5, 10, 0, -5, 42}; \r\nstd::sort(numbers.begin(), numbers.end()); \r\n\r\nstd::vector numbers{5, 10, 0, -5, 42}; \r\nstd::sort(numbers.begin(), numbers.end());<\/pre>\n<p>Ve son olarak C++ 20 ile birlikte, sunulan &#8220;<span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/en.cppreference.com\/w\/cpp\/algorithm\/ranges\/sort\">ranges<\/a><\/strong><\/span>&#8221; k\u00fct\u00fcphanesi ile, begin()\/end()&#8217;leri de yazmam\u0131za gerek kalm\u0131yor :D. Ne oluyor bu durumda:<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;algorithm&gt;\r\n\r\nstd::array numbers{5, 10, 0, -5, 42}; \r\nstd::ranges::sort(numbers); \r\n\r\nstd::vector numbers{5, 10, 0, -5, 42}; \r\nstd::ranges::sort(numbers);<\/pre>\n<p>Evet arkada\u015flar, kullan\u0131labilirlik perspektifinden ilk kodun, C++ 20&#8217;ye kadar nas\u0131l bir de\u011fi\u015fim ge\u00e7irdi\u011fini, bu basit kullan\u0131mda g\u00f6rm\u00fc\u015f olduk. Elbette, her yeni kabiliyet i\u00e7in bu m\u00fcmk\u00fcn ya da bu kadar a\u00e7\u0131k olmayabilir.<\/p>\n<blockquote><p>Bunun ile birlikte, yeni C++ kabiliyetlerini kullan\u0131rken, \u00f6zellikle okunabilirlik ve kullan\u0131m kolayl\u0131\u011f\u0131 anlam\u0131nda fark yaratacak kabiliyetlere \u00f6ncelik vermekte fayda oldu\u011funa inan\u0131yorum.<\/p><\/blockquote>\n<p>\u015eimdi, yine bu \u00f6rnek \u00fczerinden bize performans anlam\u0131nda yeni C++ kabiliyetleri ne sunabilir ona bakal\u0131m. Bunun i\u00e7in de, yukar\u0131daki tam say\u0131lar yerine basit bir veri yap\u0131s\u0131 tan\u0131mlayal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;algorithm&gt;\r\n\r\nclass Person {\r\n   std::string mName;\r\n   std::vector&lt;double&gt; mValues;\r\n\r\n   ...\r\n   \/\/ Bu s\u0131n\u0131f\u0131 s\u0131ralamada kullanabilmek i\u00e7in &lt;  operat\u00f6r\u00fcn\u00fcn tan\u0131mlanm\u0131\u015f oldu\u011fundan emin olal\u0131m   \r\n};\r\n\r\nstd::vector&lt;Person&gt; ademoglu;\r\nstd::sort(ademoglu.begin(), ademoglu.end());<\/pre>\n<p>C++ 98 durumunda, burada kulland\u0131\u011f\u0131m\u0131z veri yap\u0131s\u0131ndan \u00f6t\u00fcr\u00fc, konteyner i\u00e7erisindeki ilgili nesneler s\u0131ralama esnas\u0131nda kopyalanmak durumundayd\u0131.<\/p>\n<p>C++ 11 ile bunun \u00f6n\u00fcne ge\u00e7ebildik, peki bunu ne ile sa\u011flad\u0131k? Elbette &#8220;<span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2018\/03\/16\/modern-c-5-tasima-semantikleri\/\">move semantics<\/a><\/strong><\/span>&#8221; ile (hemen yaz\u0131m\u0131z\u0131 da referans olarak ekleyelim, bo\u015funa m\u0131 yazd\u0131k \ud83d\ude09 ) Peki, bu durumda kod i\u00e7erisinde ne gibi g\u00fcncellemeler yapt\u0131k. \u0130\u015fte, en g\u00fczel taraf\u0131 burada. Hi\u00e7 bir de\u011fi\u015fiklik yapmadan, C++ 11 deste\u011fi olan bir derleyici ile yukar\u0131daki kodu, sadece yeniden derledi\u011finizde, neredeyse 10 kat performans kazanc\u0131 sa\u011flam\u0131\u015f oluyorsunuz. O la la.<\/p>\n<p>Burada bitti mi? Elbette hay\u0131r. C++ 17&#8242; de ise gelen paralel STL algoritmalar\u0131 ile de (ki bu konuda sonraki i\u015flenecekler konusu listesinin \u00fcst s\u0131ralar\u0131nda), olay bamba\u015fka bir boyut kazan\u0131yor. Hemen koda bakal\u0131m, sonra \u00e7ay\u0131m\u0131z\u0131 al\u0131p yorumlayal\u0131m \ud83d\ude42<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;algorithm&gt;\r\n\r\nclass Person {\r\n   std::string mName;\r\n   std::vector&lt;double&gt; mValues;\r\n\r\n   ...\r\n   \/\/ Bu s\u0131n\u0131f\u0131 s\u0131ralamada kullanabilmek i\u00e7in &lt;  operat\u00f6r\u00fcn\u00fcn tan\u0131mlanm\u0131\u015f oldu\u011fundan emin olal\u0131m   \r\n};\r\n\r\nstd::vector&lt;Person&gt; ademoglu;\r\nstd::sort(std::execution::par, ademoglu.begin(), ademoglu.end());<\/pre>\n<p>Normal \u015fartlarda asl\u0131nda, bu tarz s\u0131ralama algoritmalar\u0131n\u0131 h\u0131zland\u0131rmak i\u00e7in birden fazla thread kullan\u0131p, farkl\u0131 ko\u015fum mekanizmalar\u0131 ile paralellik sa\u011flayabilirsiniz ama bunun i\u00e7in elinizi biraz kirletmeniz gerekiyor. \u0130\u015fte STL, sizleri bundan kurtar\u0131yor, kurtarmakla da kalm\u0131yor bir \u00e7ok opsiyon da sunuyor. \u00c7ok detay\u0131na girmeden burada kullan\u0131labilecek y\u00f6ntemleri \u015fu \u015fekilde \u00f6zetleyebiliriz:<\/p>\n<ul class=\"\">\n<li id=\"a091\" class=\"hx hy fn hz b ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu lb lc ld gj\" data-selectable-paragraph=\"\"><strong>S\u0131ral\u0131 (Sequential Execution)<\/strong>: S\u0131ra korunarak, normal \u00e7al\u0131\u015fma prensibi, varsay\u0131lan yakla\u015f\u0131m.<\/li>\n<li id=\"e8da\" class=\"hx hy fn hz b ia le ic id ie lf ig ih ii lg ik il im lh io ip iq li is it iu lb lc ld gj\" data-selectable-paragraph=\"\"><strong>S\u0131ral\u0131 Paralel (Parallel Sequenced Execution):<\/strong> M\u00fcmk\u00fcnse, i\u015flem farkl\u0131 thread&#8217;lere da\u011f\u0131t\u0131ls\u0131n ama s\u0131ra da g\u00f6zetilsin, <strong>std::execution::par<\/strong> kullan\u0131m\u0131.<\/li>\n<li id=\"1bcc\" class=\"hx hy fn hz b ia le ic id ie lf ig ih ii lg ik il im lh io ip iq li is it iu lb lc ld gj\" data-selectable-paragraph=\"\"><strong>S\u0131ras\u0131z Paralel (Parallel Unsequenced Execution):<\/strong> Asl\u0131nda, ilgili algoritman\u0131n SIMD, vekt\u00f6rizasyonuna kar\u015f\u0131l\u0131k gelen kullan\u0131ma kar\u015f\u0131l\u0131k geliyor ki, uygun algoritmalar i\u00e7in olduk\u00e7a fazla performans kazanc\u0131 sa\u011flayabilir ama algoritman\u0131n buna uyumlu olmas\u0131 gerekir elbette. Bu kullan\u0131m i\u00e7in de <strong>std::execution::par_unseq<\/strong> kullan\u0131lmal\u0131d\u0131r.<\/li>\n<\/ul>\n<p>A\u015fa\u011f\u0131da, bu \u00fc\u00e7 y\u00f6nteme ili\u015fkin g\u00fczel bir g\u00f6sterimi bulabilirsiniz:<\/p>\n<p id=\"eGIZkqh\"><img loading=\"lazy\" decoding=\"async\" width=\"783\" height=\"505\" class=\"alignnone size-full wp-image-2203 aligncenter\" src=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2021\/05\/img_60a17b8324c73.png\" alt=\"\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2021\/05\/img_60a17b8324c73.png 783w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2021\/05\/img_60a17b8324c73-300x193.png 300w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2021\/05\/img_60a17b8324c73-768x495.png 768w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2021\/05\/img_60a17b8324c73-500x322.png 500w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2021\/05\/img_60a17b8324c73-150x97.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2021\/05\/img_60a17b8324c73-400x258.png 400w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2021\/05\/img_60a17b8324c73-200x129.png 200w\" sizes=\"auto, (max-width: 783px) 100vw, 783px\" \/><\/p>\n<p>Burada dikkat edilmesi gereken, \u00f6zellikle s\u0131ras\u0131z paralel kullan\u0131m\u0131na ili\u015fkin \u015fu an bir kontrol bulunmamaktaym\u0131\u015f, fakat ileride buna ili\u015fkin de bir tak\u0131m g\u00fcncellemeler gelebilir.<\/p>\n<p>Bu k\u00fct\u00fcphane ve VS&#8217;de kullan\u0131m\u0131na ili\u015fkin<span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/devblogs.microsoft.com\/cppblog\/using-c17-parallel-algorithms-for-better-performance\/\"><strong> https:\/\/devblogs.microsoft.com\/cppblog\/using-c17-parallel-algorithms-for-better-performance\/<\/strong> <\/a><\/span>kayna\u011f\u0131na g\u00f6z atabilirsiniz.<\/p>\n<p>Evet arkada\u015flar, yaz\u0131m\u0131 bitirmeden \u00f6nce, bu yaz\u0131y\u0131 yazmaya beni iten ve ana kayna\u011f\u0131m olan videoya da (ve de ba\u015fl\u0131\u011f\u0131n kayna\u011f\u0131na \ud83d\ude42 ) k\u0131saca de\u011fineyim. A\u00e7\u0131k\u00e7as\u0131 bir s\u00fcre \u00f6nce, QT ile ilgili bir video izlerken denk geldim bu videoya (otomatik izlemeden d\u00fc\u015ft\u00fc diyebilirim, sa\u011folas\u0131n youtube), ilk ba\u015fta haftal\u0131k video yaz\u0131s\u0131 olarak payla\u015facakt\u0131m ama a\u00e7\u0131k\u00e7as\u0131 i\u00e7erik olarak \u00e7ok ho\u015fuma gitti\u011fi i\u00e7in yaz\u0131ya d\u00f6k\u00fcp sizler ile payla\u015fmak istedim.<\/p>\n<p>Bu video i\u00e7erisinde Nicolai (ki kendisinin C++ile ilgili bir \u00e7ok kitab\u0131 var ve benim de ba\u015fvuru kaynaklar\u0131mdan birisidir), C++&#8217;\u0131n, C++98&#8217;den, C++ 20&#8217;ye kadar olan geli\u015fimini \u00fc\u00e7 temel perspektiften; kullan\u0131labilirlik, performans ve uyarlanabilirlik a\u00e7\u0131s\u0131ndan, \u00f6rnek kodlar \u00fczerinden aktar\u0131yor. Bu yaz\u0131mda ilk ikisine de\u011findim. A\u00e7\u0131k\u00e7as\u0131 \u00e7ok uzatmamak ad\u0131na, uyarlama ile ilgili k\u0131sma yaz\u0131mda de\u011finmedim ama h\u0131zl\u0131ca \u00f6zetleyeyim (yine dayanamd\u0131m \ud83d\ude42<\/p>\n<ul>\n<li>Yeni tan\u0131mlad\u0131\u011f\u0131m\u0131z s\u0131n\u0131f\u0131 s\u0131ralamada kullanmak i\u00e7in ekledi\u011fimiz &lt; operat\u00f6r yan\u0131nda, kar\u015f\u0131la\u015ft\u0131rma anlam\u0131nda tam bir destek sunmak i\u00e7in di\u011fer alt\u0131 kar\u015f\u0131la\u015ft\u0131rma operat\u00f6r\u00fc tan\u0131mlama gereklili\u011fi, fakat bunun da C++ 20 ile gelen uzaygemisi operat\u00f6r\u00fc ile \u00e7\u00f6z\u00fcmlenebilece\u011fine de\u011finiyor. Bu konuya da, <span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2019\/11\/24\/uzay-gemisi-operatoru-stdsource_location-ve-template\/\">\u00f6nceki yaz\u0131mda<\/a><\/strong><\/span> de\u011finmi\u015ftim.<\/li>\n<li>Bir di\u011fer konu, daha karma\u015f\u0131k s\u0131ralama i\u00e7in bir kriter kullan\u0131m\u0131 ihtiyac\u0131:\n<ul>\n<li>C++ 98&#8217;de bunu, std::sort&#8217;a ge\u00e7irilen ve d\u0131\u015far\u0131da tan\u0131mlanm\u0131\u015f bir fonksiyon ile (ya da fonksiyon nesneleri ile) ger\u00e7ekle\u015ftirebilirken, C++ 11&#8217;de bunu lambda tan\u0131mlamalar\u0131 ile kullan\u0131ld\u0131\u011f\u0131 yerde (&#8220;on the fly&#8221;), hatta \u00e7al\u0131\u015fma zaman\u0131 girdileri ile tan\u0131mlayabiliyorsunuz,<\/li>\n<li>C++ 14 ile gelen jenerik lambda&#8217;lar ile tipten de soyutlayabiliyorsunuz,<\/li>\n<li>Ve son olarak C++ 20 ile gelen &#8220;Concepts&#8221; ile ge\u00e7irilen arg\u00fcmanlara\/template&#8217;lara ili\u015fkin gereksinim\/k\u0131s\u0131t tan\u0131mlayabiliyorsunuz.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek dile\u011fiyle, kendinize iyi bak\u0131n ve sa\u011fl\u0131kla kal\u0131n.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Kaynaklar<\/strong><\/span><\/h2>\n<ul>\n<li><a href=\"https:\/\/youtu.be\/ZQWg1koOKy8\"><span style=\"color: #008000;\"><strong>https:\/\/youtu.be\/ZQWg1koOKy8<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.tutorialspoint.com\/data_structures_algorithms\/quick_sort_algorithm.htm\"><span style=\"color: #008000;\"><strong>https:\/\/www.tutorialspoint.com\/data_structures_algorithms\/quick_sort_algorithm.htm<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/class_template_argument_deduction\"><span style=\"color: #008000;\"><strong>https:\/\/en.cppreference.com\/w\/cpp\/language\/class_template_argument_deduction<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/algorithm\/ranges\/sort\"><span style=\"color: #008000;\"><strong>https:\/\/en.cppreference.com\/w\/cpp\/algorithm\/ranges\/sort<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/ranges\"><span style=\"color: #008000;\"><strong>https:\/\/en.cppreference.com\/w\/cpp\/ranges<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/devblogs.microsoft.com\/cppblog\/using-c17-parallel-algorithms-for-better-performance\/\"><span style=\"color: #008000;\"><strong>https:\/\/devblogs.microsoft.com\/cppblog\/using-c17-parallel-algorithms-for-better-performance\/<\/strong><\/span><\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Haftal\u0131k C++ yaz\u0131lar\u0131m\u0131n bir di\u011feri ile tekrar birlikteyiz, sevgili yaz\u0131l\u0131mperver dostlar\u0131m. Bu \u00e7ok uzun olmayan yaz\u0131m ile birlikte, bir kod par\u00e7as\u0131n\u0131n\/problemin yeni gelen C++ kabiliyetleri ile nas\u0131l geli\u015fti\u011fine, farkl\u0131 perspektiflerden bak\u0131yor olaca\u011f\u0131z. Bu ba\u011flamda bakaca\u011f\u0131m\u0131z kod par\u00e7as\u0131, &#8220;quicksort&#8221; ile ilgili olacak. &#8220;Quicksort&#8221; &#8216;a ili\u015fkin bir fikriniz yok ise hemen bir g\u00f6z atmak ya da hat\u0131rlamak&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":174,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[10,41,188],"tags":[864,46,398,234,862,863,868,869,865,816,867,381,105,866],"class_list":["post-2199","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","category-yazilim-muhendisligi","tag-algoritm","tag-c-11","tag-c-14","tag-c-17","tag-c-98","tag-c20","tag-class-template-argument-deduction-ctad","tag-paralel-stl-algorithms","tag-quick-sort","tag-ranges","tag-stdarray","tag-stdinitializer_list","tag-stdmove","tag-stdsort"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Haftal\u0131k C++ 38 - Daha da Modern C++ - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Haftal\u0131k C++ 38 - Daha da Modern C++ - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Haftal\u0131k C++ yaz\u0131lar\u0131m\u0131n bir di\u011feri ile tekrar birlikteyiz, sevgili yaz\u0131l\u0131mperver dostlar\u0131m. Bu \u00e7ok uzun olmayan yaz\u0131m ile birlikte, bir kod par\u00e7as\u0131n\u0131n\/problemin yeni gelen C++ kabiliyetleri ile nas\u0131l geli\u015fti\u011fine, farkl\u0131 perspektiflerden bak\u0131yor olaca\u011f\u0131z. Bu ba\u011flamda bakaca\u011f\u0131m\u0131z kod par\u00e7as\u0131, &#8220;quicksort&#8221; ile ilgili olacak. &#8220;Quicksort&#8221; &#8216;a ili\u015fkin bir fikriniz yok ise hemen bir g\u00f6z atmak ya da hat\u0131rlamak... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2021-05-16T20:41:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png\" \/>\n\t<meta property=\"og:image:width\" content=\"32\" \/>\n\t<meta property=\"og:image:height\" content=\"32\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"Haftal\u0131k C++ 38 &#8211; Daha da Modern C++\",\"datePublished\":\"2021-05-16T20:41:30+00:00\",\"dateModified\":\"2021-05-16T20:41:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/\"},\"wordCount\":1300,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"algoritm\",\"C++ 11\",\"C++ 14\",\"c++ 17\",\"C++ 98\",\"C++20\",\"Class Template Argument Deduction\/CTAD\",\"paralel STL algorithms\",\"quick sort\",\"Ranges\",\"std::array\",\"std::initializer_list\",\"std::move\",\"std::sort\"],\"articleSection\":[\"C++\",\"Modern C++\",\"Yaz\u0131l\u0131m M\u00fchendisli\u011fi\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/\",\"name\":\"Haftal\u0131k C++ 38 - Daha da Modern C++ - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2021-05-16T20:41:30+00:00\",\"dateModified\":\"2021-05-16T20:41:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Haftal\u0131k C++ 38 &#8211; Daha da Modern C++\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Haftal\u0131k C++ 38 - Daha da Modern C++ - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/","og_locale":"tr_TR","og_type":"article","og_title":"Haftal\u0131k C++ 38 - Daha da Modern C++ - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Haftal\u0131k C++ yaz\u0131lar\u0131m\u0131n bir di\u011feri ile tekrar birlikteyiz, sevgili yaz\u0131l\u0131mperver dostlar\u0131m. Bu \u00e7ok uzun olmayan yaz\u0131m ile birlikte, bir kod par\u00e7as\u0131n\u0131n\/problemin yeni gelen C++ kabiliyetleri ile nas\u0131l geli\u015fti\u011fine, farkl\u0131 perspektiflerden bak\u0131yor olaca\u011f\u0131z. Bu ba\u011flamda bakaca\u011f\u0131m\u0131z kod par\u00e7as\u0131, &#8220;quicksort&#8221; ile ilgili olacak. &#8220;Quicksort&#8221; &#8216;a ili\u015fkin bir fikriniz yok ise hemen bir g\u00f6z atmak ya da hat\u0131rlamak... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2021-05-16T20:41:30+00:00","og_image":[{"width":32,"height":32,"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png","type":"image\/png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"8 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"Haftal\u0131k C++ 38 &#8211; Daha da Modern C++","datePublished":"2021-05-16T20:41:30+00:00","dateModified":"2021-05-16T20:41:30+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/"},"wordCount":1300,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["algoritm","C++ 11","C++ 14","c++ 17","C++ 98","C++20","Class Template Argument Deduction\/CTAD","paralel STL algorithms","quick sort","Ranges","std::array","std::initializer_list","std::move","std::sort"],"articleSection":["C++","Modern C++","Yaz\u0131l\u0131m M\u00fchendisli\u011fi"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/","name":"Haftal\u0131k C++ 38 - Daha da Modern C++ - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2021-05-16T20:41:30+00:00","dateModified":"2021-05-16T20:41:30+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2021\/05\/16\/haftalik-c-38-daha-da-modern-c\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Haftal\u0131k C++ 38 &#8211; Daha da Modern C++"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/2199","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=2199"}],"version-history":[{"count":8,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/2199\/revisions"}],"predecessor-version":[{"id":2209,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/2199\/revisions\/2209"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media\/174"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=2199"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=2199"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=2199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}