{"id":19526803,"url":"https://github.com/deepcloudlabs/dcl113-2023-aug-14","last_synced_at":"2026-06-09T22:31:45.679Z","repository":{"id":188173998,"uuid":"678236247","full_name":"deepcloudlabs/dcl113-2023-aug-14","owner":"deepcloudlabs","description":"DCL-113: Functional Programming in C++20","archived":false,"fork":false,"pushed_at":"2023-08-16T06:21:26.000Z","size":193,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-26T02:25:48.538Z","etag":null,"topics":["cpp17","cpp20","functional-programming","functors","higher-order-functions","lambda-expressions","lazy-evaluation","partial-functions","pure-functions","ranges","ranges-v3","stl-containers"],"latest_commit_sha":null,"homepage":"https://www.deepcloudlabs.com","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/deepcloudlabs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-08-14T04:41:22.000Z","updated_at":"2023-08-15T16:38:54.000Z","dependencies_parsed_at":"2023-10-11T08:59:30.625Z","dependency_job_id":"b86096e1-1905-482d-bb92-05e6f872be32","html_url":"https://github.com/deepcloudlabs/dcl113-2023-aug-14","commit_stats":{"total_commits":22,"total_committers":1,"mean_commits":22.0,"dds":0.0,"last_synced_commit":"0e9ac2daa6e4c19094f0c3a0c72efae4050396e1"},"previous_names":["deepcloudlabs/dcl113-2023-aug-14"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/deepcloudlabs/dcl113-2023-aug-14","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deepcloudlabs%2Fdcl113-2023-aug-14","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deepcloudlabs%2Fdcl113-2023-aug-14/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deepcloudlabs%2Fdcl113-2023-aug-14/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deepcloudlabs%2Fdcl113-2023-aug-14/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deepcloudlabs","download_url":"https://codeload.github.com/deepcloudlabs/dcl113-2023-aug-14/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deepcloudlabs%2Fdcl113-2023-aug-14/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34129072,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp17","cpp20","functional-programming","functors","higher-order-functions","lambda-expressions","lazy-evaluation","partial-functions","pure-functions","ranges","ranges-v3","stl-containers"],"created_at":"2024-11-11T01:12:13.518Z","updated_at":"2026-06-09T22:31:45.660Z","avatar_url":"https://github.com/deepcloudlabs.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DCL-113: Functional Programming in C++20\n\nThese projects are created as part of the following training: DCL-113 \"Functional Programming in C++20\"\n\nPlease follow the link for the complete training catalog: https://www.deepcloudlabs.com/resources\n\n## C++17'de Fonksiyonel Programlama\n\nC++11 ile birlikte C++'da fonksiyonel programlama yapılabiliniyor. Standard Template Library (STL) ile fonksiyonel programlama birlikte kullanıldığında karmaşık kod parçalarını daha basit ve yalın hale indirgediği söylenebilir. Bu yazıda bu yalınlığı göstermek üzere örnekler sunacağım. Önce problem uzayını tanıtacağım. Yazılarımın çoğunda kullandığım dünya ülkeleri ve şehirlerinden yararlanacağım:\n\n``` cpp\ncity.h:\n\n#ifndef __city_h__\n#define __city_h__\n\n#include \"country.h\"\n\n#include \u003cstring\u003e\n#include \u003cmemory\u003e\n#include \u003ciostream\u003e\n\nnamespace world {\n // forward declaration\n struct country;\n struct city;\n\n struct city {\n  int id;\n  std::string name;\n  std::string country_code; \n  int population;\n  std::shared_ptr\u003cworld::country\u003e belongs_to;\n  \n  city(int id,const std::string\u0026 name,const std::string\u0026 country_code,int population);\n };\n  \n};\n\nstd::ostream\u0026 operator\u003c\u003c(std::ostream\u0026 out,const world::city\u0026 _city); \n#endif\n```\ncity.cpp:\n``` cpp\n#include \"city.h\"\n\nnamespace world {\n \n city::city(int id,const std::string\u0026 name,const std::string\u0026 country_code,int population){\n  this-\u003eid= id;\n  this-\u003ename= name;\n  this-\u003epopulation= population;\n  this-\u003ecountry_code= country_code;\n }\n   \n};\n\nstd::ostream\u0026 operator\u003c\u003c(std::ostream\u0026 out,const world::city\u0026 _city){\n out \u003c\u003c \"city [ id=\" \u003c\u003c _city.id \n  \u003c\u003c \", name=\" \u003c\u003c _city.name \n  \u003c\u003c \", \" \u003c\u003c *(_city.belongs_to)\n  \u003c\u003c \", population=\" \n  \u003c\u003c _city.population \n  \u003c\u003c \" ]\";\n return out;\n}  \n```\n\ncountry.h:\n\n``` cpp\n#ifndef __country_h__\n#define __country_h__\n\n#include \"city.h\"\n\n#include \u003cvector\u003e\n#include \u003cmemory\u003e\n#include \u003ciostream\u003e\n#include \u003cstring\u003e\n\nnamespace world {\n // forward declaration\n struct city;\n struct country;\n \n struct country {   \n  std::string code;\n  std::string continent;\n  std::string name;\n  double surface_area;\n  int population;\n  double gnp;\n  int capital_id;\n  std::shared_ptr\u003cworld::city\u003e capital;\n  std::vector\u003cstd::shared_ptr\u003cworld::city\u003e\u003e cities;   \n  country(const std::string\u0026,const std::string\u0026,const std::string\u0026,int,double,double,int);  \n  country(const std::string\u0026,const std::string\u0026,const std::string\u0026,int,double,double,int,std::vector\u003cstd::shared_ptr\u003cworld::city\u003e\u003e\u0026,std::shared_ptr\u003cworld::city\u003e\u0026);  \n };\n};\nstd::ostream\u0026 operator\u003c\u003c(std::ostream\u0026,const world::country\u0026);\n#endif\n```\n\ncountry.cpp:\n\n``` cpp\n#include \"country.h\"\n\nnamespace world {\n country::country(const std::string\u0026 code,const std::string\u0026 name,const std::string\u0026 continent,int population,double surface_area,double gnp,int capital_id){\n  this-\u003ecode= code;\n  this-\u003ename= name;\n  this-\u003econtinent= continent;\n  this-\u003epopulation= population;\n  this-\u003esurface_area= surface_area;\n  this-\u003egnp= gnp;\n  this-\u003ecapital_id= capital_id;\n } \n country::country(const std::string\u0026 code,const std::string\u0026 name,const std::string\u0026 continent,int population,double surface_area,double gnp,int capital_id,std::vector\u003cstd::shared_ptr\u003cworld::city\u003e\u003e\u0026 cities,std::shared_ptr\u003cworld::city\u003e\u0026 capital){\n  this-\u003ecode= code;\n  this-\u003ename= name;\n  this-\u003econtinent= continent;\n  this-\u003epopulation= population;\n  this-\u003esurface_area= surface_area;\n  this-\u003egnp= gnp;\n  this-\u003ecapital_id= capital_id;\n  this-\u003ecities= cities;\n  this-\u003ecapital= capital;\n }\n};\n\nstd::ostream\u0026 operator\u003c\u003c(std::ostream\u0026 out,const world::country\u0026 _country){\n out \u003c\u003c \"country [ code=\" \u003c\u003c _country.code \n  \u003c\u003c \", name=\" \u003c\u003c _country.name \n  \u003c\u003c \", population=\" \u003c\u003c _country.population \n  \u003c\u003c \", surface_area=\" \u003c\u003c _country.surface_area \n  \u003c\u003c \", capital=\" \u003c\u003c _country.capital_id\n  \u003c\u003c \", # of cities= \" \u003c\u003c _country.cities.size() \n  \u003c\u003c \" ]\";\n return out; \n}\n```\n\ncountry ve city sınıfları dünya ülke ve şehirlerini modeller. country ve city sınıfları arasında bire-çoklu ve bire-bir bir ilişki bulunuyor:\n``` cpp\nworld-util.h:\n\n#ifndef __world_util_h__\n#define __world_util_h__\n\n#include \"city.h\"\n#include \"country.h\"\n\n#include \u003cmemory\u003e\n#include \u003cmap\u003e\n#include \u003cstring\u003e\n#include \u003ciostream\u003e\n#include \u003calgorithm\u003e\n\nextern std::map\u003cint,std::shared_ptr\u003cworld::city\u003e\u003e cities;\nextern std::map\u003cstd::string,std::shared_ptr\u003cworld::country\u003e\u003e countries;\n\nvoid create_cities();\nvoid create_countries();\nvoid create_world();\n\n#endif\n\nworld-util.cpp:\n\n#include \"world-util.h\"\n\nvoid create_cities(){\n std::cout \u003c\u003c \"Creating cities...\" ;\n cities[1]= std::make_shared\u003cworld::city\u003e(world::city(1, std::string(\"Kabul\"), std::string(\"AFG\"), 1780000));\n        .\n        .\n        .\n cities[4079]= std::make_shared\u003cworld::city\u003e(world::city(4079, std::string(\"Rafah\"), std::string(\"PSE\"), 92020));\n std::cout \u003c\u003c \"done.\" \u003c\u003c std::endl;  \n}\n\nvoid create_countries(){\n std::cout \u003c\u003c \"Creating countries...\" ;  \n countries[std::string(\"ABW\")]= std::make_shared\u003cworld::country\u003e(world::country(std::string(\"ABW\"), std::string(\"Aruba\"), std::string(\"North America\"), 103000, 193.00, 828.00, 129));\n        .\n        .\n        .\n countries[std::string(\"ZWE\")]= std::make_shared\u003cworld::country\u003e(world::country(std::string(\"ZWE\"), std::string(\"Zimbabwe\"), std::string(\"Africa\"), 11669000, 390757.00, 5951.00, 4068)); \n std::cout \u003c\u003c \"done.\" \u003c\u003c std::endl; \n} \n\nvoid create_world(){\n create_cities();\n create_countries(); \n \n auto linkCityToCountry= [](std::pair\u003cconst int,std::shared_ptr\u003cworld::city\u003e\u003e\u0026 entry) -\u003e void {\n  auto city= entry.second.get();\n  auto country= countries[city-\u003ecountry_code];\n  city-\u003ebelongs_to = std::make_shared\u003cworld::country\u003e(*country);\n  country-\u003ecities.push_back(std::make_shared\u003cworld::city\u003e(*city)); \n };  \n \n auto linkCapitalCityToCountry= [](std::pair\u003cconst std::string,std::shared_ptr\u003cworld::country\u003e\u003e\u0026 entry) -\u003e void {\n  auto country= entry.second.get();\n  if (country-\u003ecapital_id\u003e=0){\n   auto capital= cities[country-\u003ecapital_id];\n   country-\u003ecapital= std::make_shared\u003cworld::city\u003e(*capital);   \n  }\n }; \n \n std::for_each(cities.begin(),cities.end(),linkCityToCountry);\n std::for_each(countries.begin(),countries.end(),linkCapitalCityToCountry);\n}\n```\n\nArtık bu alan modeli üzerinden örnek problemler çözerek hem STL hem de fonksiyonel programlama çalışabiliriz:\n\n1. Dünyadaki kıtaların bir listesini hesaplayalım:\n\nexercise1.cpp:\n\n``` cpp\n#include \"city.h\"\n#include \"country.h\" \n#include \"world-util.h\" \n\n#include \u003cset\u003e\n#include \u003cmap\u003e\n#include \u003ciostream\u003e\n#include \u003cstring\u003e\n#include \u003cmemory\u003e\n#include \u003calgorithm\u003e\n\nusing namespace std;\nusing namespace world;\n\nstd::map\u003cint,std::shared_ptr\u003cworld::city\u003e\u003e cities;\nstd::map\u003cstd::string,std::shared_ptr\u003cworld::country\u003e\u003e countries;\n\nint main(int argc, char* argv[]){\n create_world();\n \n auto distinctContinentReducer= [](set\u003cstring\u003e\u0026 continents, pair\u003cconst string,shared_ptr\u003ccountry\u003e\u003e\u0026 entry) -\u003e set\u003cstring\u003e\u0026  {\n  auto country= entry.second.get();\n  continents.insert(country-\u003econtinent);\n  return continents;\n }; \n \n auto continents= accumulate(countries.begin(),countries.end(),set\u003cstring\u003e(), distinctContinentReducer);\n \n for (auto\u0026 continent: continents){\n  cout \u003c\u003c continent \u003c\u003c endl; \n }\n  \n return 0;\n}\n```\n\nYukarıdaki uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz:\n\n```\n$ ./exercise1\nCreating cities...done.\nCreating countries...done.\nAfrica\nAntarctica\nAsia\nEurope\nNorth America\nOceania\nSouth America\n```\n\n2. Her bir kıtada kaç ülke olduğunu bulalım:\n\nexercise2.cpp:\n\n``` cpp\n#include \"city.h\"\n#include \"country.h\" \n#include \"world-util.h\" \n\n#include \u003cset\u003e\n#include \u003cmap\u003e\n#include \u003ciostream\u003e\n#include \u003cstring\u003e\n#include \u003cmemory\u003e\n#include \u003calgorithm\u003e\n\nusing namespace std;\nusing namespace world;\n\nstd::map\u003cint,std::shared_ptr\u003cworld::city\u003e\u003e cities;\nstd::map\u003cstd::string,std::shared_ptr\u003cworld::country\u003e\u003e countries;\n\nint main(int argc, char* argv[]){\n create_world();\n \n auto countCountriesInContinentReducer= [](map\u003cstring,int\u003e\u0026 numberOfCountriesInEachContinent, pair\u003cconst string,shared_ptr\u003ccountry\u003e\u003e\u0026 entry) -\u003e map\u003cstring,int\u003e\u0026  {\n  auto country= entry.second.get();\n  auto continent= country-\u003econtinent;\n  auto end= numberOfCountriesInEachContinent.end();\n  auto iterator= numberOfCountriesInEachContinent.emplace_hint(end,continent,0);\n  (iterator-\u003esecond)++;\n  return numberOfCountriesInEachContinent;\n }; \n \n auto continentCountriesCounter= accumulate(countries.begin(),countries.end(),map\u003cstring,int\u003e(),countCountriesInContinentReducer);\n \n for (auto\u0026 entry: continentCountriesCounter){\n  cout \u003c\u003c entry.first \u003c\u003c \": \" \u003c\u003c entry.second \u003c\u003c endl; \n }\n  \n return 0;\n}\n```\n\nYukarıdaki uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz:\n\n```\n$ ./exercise2\nCreating cities...done.\nCreating countries...done.\nAfrica: 58\nAntarctica: 5\nAsia: 51\nEurope: 46\nNorth America: 37\nOceania: 28\nSouth America: 14\n```\n\n3. Dünyanın, GNP (Gross National Product)(=Gayri Safi Milli Hasıla) değerine göre en zengin ülkesini bulalım:\n\nexercise3.cpp:\n\n``` cpp\n#include \"city.h\"\n#include \"country.h\" \n#include \"world-util.h\" \n\n#include \u003cset\u003e\n#include \u003cmap\u003e\n#include \u003ciostream\u003e\n#include \u003cstring\u003e\n#include \u003cmemory\u003e\n#include \u003calgorithm\u003e\n\nusing namespace std;\nusing namespace world;\n\nstd::map\u003cint,std::shared_ptr\u003cworld::city\u003e\u003e cities;\nstd::map\u003cstd::string,std::shared_ptr\u003cworld::country\u003e\u003e countries;\n\nint main(int argc, char* argv[]){\n create_world();\n \n auto gnpComparator= [](pair\u003cconst string,shared_ptr\u003ccountry\u003e\u003e\u0026 left, pair\u003cconst string,shared_ptr\u003ccountry\u003e\u003e\u0026 right) -\u003e bool  {\n  return left.second-\u003egnp \u003c right.second-\u003egnp;\n }; \n \n auto richestCountryPair= max_element(countries.begin(),countries.end(),gnpComparator);\n auto richestCountry= *(richestCountryPair-\u003esecond);\n \n cout \u003c\u003c richestCountry \u003c\u003c endl; \n  \n return 0;\n}\n```\n\nYukarıdaki uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz:\n\n```\n$ ./exercise3\nCreating cities...done.\nCreating countries...done.\ncountry [ code=USA, name=United States, population=278357000, surface_area=9.36352e+06, capital=3813, # of cities= 274 ]\n```\n\n4. Şimdi her kıtanın GNP (Gross National Product)(=Gayri Safi Milli Hasıla) değerine göre en zengin ülkesini bulalım:\n\n``` cpp\nexercise4.cpp:\n\n#include \"city.h\"\n#include \"country.h\" \n#include \"world-util.h\" \n\n#include \u003cvector\u003e\n#include \u003cmap\u003e\n#include \u003ciostream\u003e\n#include \u003cstring\u003e\n#include \u003cmemory\u003e\n#include \u003calgorithm\u003e\n\nusing namespace std;\nusing namespace world;\n\nstd::map\u003cint,std::shared_ptr\u003cworld::city\u003e\u003e cities;\nstd::map\u003cstd::string,std::shared_ptr\u003cworld::country\u003e\u003e countries;\n\nint main(int argc, char* argv[]){\n create_world();\n \n auto gnpComparator= [](shared_ptr\u003ccountry\u003e\u0026 left, shared_ptr\u003ccountry\u003e\u0026 right) -\u003e bool  {\n  return left-\u003egnp \u003c right-\u003egnp;\n }; \n  \n auto richestCountryOfContinentReducer=  [\u0026gnpComparator](map\u003cstring,shared_ptr\u003ccountry\u003e\u003e\u0026 richestCountriesOfContinents, pair\u003cconst string,shared_ptr\u003ccountry\u003e\u003e\u0026 entry) -\u003e map\u003cstring,shared_ptr\u003ccountry\u003e\u003e\u0026  {\n    auto country= entry.second;\n    auto continent= country-\u003econtinent;\n    auto richestCountryIterator= richestCountriesOfContinents.find(continent);\n       auto richestCountry= richestCountryIterator-\u003esecond;  \n    if (richestCountryIterator==richestCountriesOfContinents.end() || gnpComparator(richestCountry,country) )\n  richestCountriesOfContinents[continent]= country;\n    return richestCountriesOfContinents;\n }; \n \n auto richestCountriesOfContinents= accumulate(countries.begin(),countries.end(),map\u003cstring,shared_ptr\u003ccountry\u003e\u003e(),richestCountryOfContinentReducer);\n\n for (auto\u0026 entry: richestCountriesOfContinents){\n    cout \u003c\u003c entry.first \u003c\u003c \": \" \u003c\u003c *(entry.second) \u003c\u003c endl;   \n } \n  \n return 0;\n}\n```\n\nYukarıdaki uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz:\n\n```\n$ ./exercise4\nCreating cities...done.\nCreating countries...done.\nAfrica: country [ code=ZAF, name=South Africa, population=40377000, surface_area=1.22104e+06, gnp=116729, # of cities= 44 ]\nAntarctica: country [ code=ATA, name=Antarctica, population=0, surface_area=1.312e+07, gnp=0, # of cities= 0 ]\nAsia: country [ code=JPN, name=Japan, population=126714000, surface_area=377829, gnp=3.78704e+06, # of cities= 248 ]\nEurope: country [ code=DEU, name=Germany, population=82164700, surface_area=357022, gnp=2.13337e+06, # of cities= 93 ]\nNorth America: country [ code=USA, name=United States, population=278357000, surface_area=9.36352e+06, gnp=8.5107e+06, # of cities= 274 ]\nOceania: country [ code=AUS, name=Australia, population=18886000, surface_area=7.74122e+06, gnp=351182, # of cities= 14 ]\nSouth America: country [ code=BRA, name=Brazil, population=170115000, surface_area=8.5474e+06, gnp=776739, # of cities= 250 ]\n```\n\n5. Her bir kıtadaki ülkelerin listesini alalım:\n\nexercise5.cpp:\n\n``` cpp\n#include \"city.h\"\n#include \"country.h\" \n#include \"world-util.h\" \n\n#include \u003cvector\u003e\n#include \u003cmap\u003e\n#include \u003ciostream\u003e\n#include \u003cstring\u003e\n#include \u003cmemory\u003e\n#include \u003calgorithm\u003e\n\nusing namespace std;\nusing namespace world;\n\nstd::map\u003cint,std::shared_ptr\u003cworld::city\u003e\u003e cities;\nstd::map\u003cstd::string,std::shared_ptr\u003cworld::country\u003e\u003e countries;\n\nint main(int argc, char* argv[]){\n create_world();\n  \n auto continentCountriesReducer= [](map\u003cstring,vector\u003cshared_ptr\u003ccountry\u003e\u003e\u003e\u0026 continentCountries, pair\u003cconst string,shared_ptr\u003ccountry\u003e\u003e\u0026 entry) -\u003e map\u003cstring,vector\u003cshared_ptr\u003ccountry\u003e\u003e\u003e\u0026  {\n  auto country= entry.second;\n  auto continent= country-\u003econtinent;\n  auto not_found= continentCountries.end();  \n  auto iterator= continentCountries.find(continent);\n  if (iterator==not_found) continentCountries[continent]= vector\u003cshared_ptr\u003cworld::country\u003e\u003e();\n  continentCountries[continent].push_back(country);\n  return continentCountries;\n }; \n  \n auto countriesOfContinents= accumulate(countries.begin(),countries.end(),map\u003cstring,vector\u003cshared_ptr\u003ccountry\u003e\u003e\u003e(),continentCountriesReducer);\n\n for (auto\u0026 entry: countriesOfContinents){\n    cout \u003c\u003c entry.first \u003c\u003c endl;   \n    for (auto\u0026 eachCountry : entry.second){\n        cout \u003c\u003c *eachCountry \u003c\u003c endl;\n    }\n    cout \u003c\u003c endl;\n } \n  \n return 0;\n}\n```\n\nYukarıdaki uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz:\n\n```\n$ ./exercise5\nCreating cities...done.\nCreating countries...done.\nAfrica\ncountry [ code=AGO, name=Angola, population=12878000, surface_area=1.2467e+06, gnp=6648, continent=Africa, # of cities= 5 ]\n.\n.\n.\ncountry [ code=ZWE, name=Zimbabwe, population=11669000, surface_area=390757, gnp=5951, continent=Africa, # of cities= 6 ]\n\nAntarctica\ncountry [ code=ATA, name=Antarctica, population=0, surface_area=1.312e+07, gnp=0, continent=Antarctica, # of cities= 0 ]\n.\n.\n.\ncountry [ code=SGS, name=South Georgia and the South Sandwich Islands, population=0, surface_area=3903, gnp=0, continent=Antarctica, # of cities= 0 ]\n\nAsia\ncountry [ code=AFG, name=Afghanistan, population=22720000, surface_area=652090, gnp=5976, continent=Asia, # of cities= 4 ]\n.\n.\n.\ncountry [ code=YEM, name=Yemen, population=18112000, surface_area=527968, gnp=6041, continent=Asia, # of cities= 6 ]\n\nEurope\ncountry [ code=ALB, name=Albania, population=3401200, surface_area=28748, gnp=3205, continent=Europe, # of cities= 1 ]\n.\n.\n.\ncountry [ code=YUG, name=Yugoslavia, population=10640000, surface_area=102173, gnp=17000, continent=Europe, # of cities= 8 ]\n\nNorth America\ncountry [ code=ABW, name=Aruba, population=103000, surface_area=193, gnp=828, continent=North America, # of cities= 1 ]\n.\n.\n.\ncountry [ code=VIR, name=Virgin Islands, U.S., population=93000, surface_area=347, gnp=0, continent=North America, # of cities= 1 ]\n\nOceania\ncountry [ code=ASM, name=American Samoa, population=68000, surface_area=199, gnp=334, continent=Oceania, # of cities= 2 ]\n.\n.\n.\ncountry [ code=WSM, name=Samoa, population=180000, surface_area=2831, gnp=141, continent=Oceania, # of cities= 1 ]\n\nSouth America\ncountry [ code=ARG, name=Argentina, population=37032000, surface_area=2.7804e+06, gnp=340238, continent=South America, # of cities= 57 ]\n.\n.\n.\ncountry [ code=VEN, name=Venezuela, population=24170000, surface_area=912050, gnp=95023, continent=South America, # of cities= 41 ]\n```\n\n6. Her bir kıta için minimum, maksimum ve ortalama nüfus sayılarını hesaplayalım:\n\nexercise6.cpp:\n\n``` cpp\n#include \"city.h\"\n#include \"country.h\" \n#include \"world-util.h\" \n\n#include \u003cvector\u003e\n#include \u003cmap\u003e\n#include \u003ciostream\u003e\n#include \u003cstring\u003e\n#include \u003cmemory\u003e\n#include \u003calgorithm\u003e\n\nusing namespace std;\nusing namespace world;\n\nstd::map\u003cint,std::shared_ptr\u003cworld::city\u003e\u003e cities;\nstd::map\u003cstd::string,std::shared_ptr\u003cworld::country\u003e\u003e countries;\n\ntemplate \u003cclass T\u003e\nstruct statistics {\n T minimum;\n T maximum;\n double sum;\n int numberOfSamples;\n statistics() : sum(0), numberOfSamples(0) {}\n statistics(T value) : sum(value), numberOfSamples(1),minimum(value),maximum(value) {}\n        double average() const {\n    if (numberOfSamples==0) return 0.0;\n    return sum/numberOfSamples;\n } \n};\n\ntemplate \u003cclass T\u003e\nstd::ostream\u0026 operator\u003c\u003c(std::ostream\u0026 out,const statistics\u003cT\u003e\u0026 stats){\n out \u003c\u003c \"statistics [ number of samples= \" \u003c\u003c stats.numberOfSamples \n     \u003c\u003c \", minimum=\" \u003c\u003c stats.minimum \n     \u003c\u003c \", maximum=\" \u003c\u003c stats.maximum\n     \u003c\u003c \", sum=\" \u003c\u003cstats.sum\n     \u003c\u003c \", average=\" \u003c\u003c stats.average()\n     \u003c\u003c \" ]\";\n return out;  \n}\n\nint main(int argc, char* argv[]){\n create_world();\n  \n auto statisticsReducer=  [](map\u003cstring,shared_ptr\u003cstatistics\u003cint\u003e\u003e\u003e\u0026 continentStatistics, pair\u003cconst string,shared_ptr\u003ccountry\u003e\u003e\u0026 entry) -\u003e map\u003cstring,shared_ptr\u003cstatistics\u003cint\u003e\u003e\u003e\u0026  {\n  auto country= entry.second;\n  auto continent= country-\u003econtinent;\n  auto continentStatisticsIterator= continentStatistics.find(continent);\n  if (continentStatisticsIterator==continentStatistics.end())\n   continentStatistics[continent]= make_shared\u003cstatistics\u003cint\u003e\u003e(statistics\u003cint\u003e(country-\u003epopulation));\n  else {   \n   auto continentStat= continentStatisticsIterator-\u003esecond;\n   auto countryPopulation= country-\u003epopulation;\n   if (continentStat-\u003eminimum \u003e countryPopulation) continentStat-\u003eminimum= countryPopulation;\n   if (continentStat-\u003emaximum \u003c countryPopulation) continentStat-\u003emaximum= countryPopulation;\n   continentStat-\u003esum += countryPopulation;\n   continentStat-\u003enumberOfSamples++;  \n  }\n     return continentStatistics;\n }; \n \n auto continentStatistics= accumulate(countries.begin(),countries.end(),map\u003cstring,shared_ptr\u003cstatistics\u003cint\u003e\u003e\u003e(),statisticsReducer);\n\n for (auto\u0026 entry: continentStatistics){\n    cout \u003c\u003c entry.first \u003c\u003c \": \" \u003c\u003c *(entry.second) \u003c\u003c endl;   \n } \n  \n return 0;\n}\n```\n\nYukarıdaki uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz:\n\n```\n$ ./exercise6\nCreating cities...done.\nCreating countries...done.\nAfrica: statistics [ number of samples= 58, minimum=0, maximum=111506000, sum=7.84475e+08, average=1.35254e+07 ]\nAntarctica: statistics [ number of samples= 5, minimum=0, maximum=0, sum=0, average=0 ]\nAsia: statistics [ number of samples= 51, minimum=286000, maximum=1277558000, sum=3.70503e+09, average=7.26476e+07 ]\nEurope: statistics [ number of samples= 46, minimum=1000, maximum=146934000, sum=7.30075e+08, average=1.58712e+07 ]\nNorth America: statistics [ number of samples= 37, minimum=7000, maximum=278357000, sum=4.82993e+08, average=1.30539e+07 ]\nOceania: statistics [ number of samples= 28, minimum=0, maximum=18886000, sum=3.04012e+07, average=1.08576e+06 ]\nSouth America: statistics [ number of samples= 14, minimum=2000, maximum=170115000, sum=3.4578e+08, average=2.46986e+07 ]\n```\n\n7. Ülkelerin, en az nüfusa ve en çok nüfusa sahip şehirlerini bulalım:\n\nexercise7.cpp:\n\n``` cpp\n#include \"city.h\"\n#include \"country.h\" \n#include \"world-util.h\" \n\n#include \u003cvector\u003e\n#include \u003cmap\u003e\n#include \u003ciostream\u003e\n#include \u003cstring\u003e\n#include \u003cmemory\u003e\n#include \u003calgorithm\u003e\n\nusing namespace std;\nusing namespace world;\n\nstd::map\u003cint,std::shared_ptr\u003cworld::city\u003e\u003e cities;\nstd::map\u003cstd::string,std::shared_ptr\u003cworld::country\u003e\u003e countries;\n\ntemplate \u003cclass E,class T\u003e\nstruct statistics {\n E min_element;\n E max_element; \n T min;\n T max;\n int numberOfSamples;\n statistics() : numberOfSamples(0) {}\n};\n\nstd::ostream\u0026 operator\u003c\u003c(std::ostream\u0026 out,const statistics\u003cshared_ptr\u003ccity\u003e,int\u003e\u0026 stats){\n if (stats.min_element.get()==nullptr) {\n     out \u003c\u003c \"No body lives in this country!\" ; \n }else{\n     out \u003c\u003c \"statistics [ \" \n         \u003c\u003c stats.min_element-\u003ename \n         \u003c\u003c \" ( \" \u003c\u003c stats.min \u003c\u003c \" )\"\n         \u003c\u003c \",  \" \u003c\u003c stats.max_element-\u003ename\n         \u003c\u003c \" ( \" \u003c\u003c stats.max \u003c\u003c \" )\"\n         \u003c\u003c \" ]\";  \n }\n return out;  \n}\n\nint main(int argc, char* argv[]){\n create_world();\n\n for (auto\u0026 entry: countries){\n  auto this_country= entry.second;\n  auto country_cities= this_country-\u003ecities;\n  auto statisticsReducer=  [](statistics\u003cshared_ptr\u003ccity\u003e,int\u003e\u0026 cityPopulationStatistics, shared_ptr\u003ccity\u003e\u0026 a_city) -\u003e statistics\u003cshared_ptr\u003ccity\u003e,int\u003e\u0026  {\n   auto cityPopulation= a_city-\u003epopulation;\n   if (cityPopulationStatistics.numberOfSamples==0){\n      cityPopulationStatistics.min= cityPopulation;\n      cityPopulationStatistics.min_element= a_city; \n      cityPopulationStatistics.max= cityPopulation;\n      cityPopulationStatistics.max_element= a_city;     \n   }\n   cityPopulationStatistics.numberOfSamples++;\n   if (cityPopulationStatistics.min\u003ecityPopulation){\n      cityPopulationStatistics.min= cityPopulation;\n      cityPopulationStatistics.min_element= a_city; \n   }\n   if (cityPopulationStatistics.max\u003ecityPopulation){\n      cityPopulationStatistics.max= cityPopulation;\n      cityPopulationStatistics.max_element= a_city; \n   }\n   return cityPopulationStatistics;\n  };     \n  auto populationStatistics= accumulate(country_cities.begin(),country_cities.end(),statistics\u003cshared_ptr\u003ccity\u003e,int\u003e(),statisticsReducer);\n  cout \u003c\u003c this_country-\u003ename \u003c\u003c \"'s statistics:\" \u003c\u003c endl;\n     cout \u003c\u003c populationStatistics \u003c\u003c endl;\n } \n  \n return 0;\n}\n\nYukarıdaki uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz:\n\n```\n$ ./exercise7\nCreating cities...done.\nCreating countries...done.\nAruba's statistics:\nstatistics [ Oranjestad ( 29034 ),  Oranjestad ( 29034 ) ]\nAfghanistan's statistics:\nstatistics [ Mazar-e-Sharif ( 127800 ),  Mazar-e-Sharif ( 127800 ) ]\nAngola's statistics:\nstatistics [ Namibe ( 118200 ),  Namibe ( 118200 ) ]\n.\n.\n.\nSouth Africa's statistics:\nstatistics [ Ladysmith ( 89292 ),  Ladysmith ( 89292 ) ]\nZambia's statistics:\nstatistics [ Luanshya ( 118100 ),  Luanshya ( 118100 ) ]\nZimbabwe's statistics:\nstatistics [ Gweru ( 128037 ),  Gweru ( 128037 ) ]\n```\n\n8. En kalabalık başkenti bulalım:\n\nexercise8.cpp:\n\n``` cpp\n#include \"city.h\"\n#include \"country.h\" \n#include \"world-util.h\" \n\n#include \u003cvector\u003e\n#include \u003cmap\u003e\n#include \u003ciostream\u003e\n#include \u003cstring\u003e\n#include \u003cmemory\u003e\n#include \u003calgorithm\u003e\n\nusing namespace std;\nusing namespace world;\n\nstd::map\u003cint,std::shared_ptr\u003cworld::city\u003e\u003e cities;\nstd::map\u003cstd::string,std::shared_ptr\u003cworld::country\u003e\u003e countries;\n\nint main(int argc, char* argv[]){\n create_world();\n  \n auto highPopulatedCapitalReducer=  [](shared_ptr\u003ccity\u003e\u0026 highPopulatedCapital, pair\u003cconst string,shared_ptr\u003ccountry\u003e\u003e\u0026 entry) -\u003e shared_ptr\u003ccity\u003e\u0026  {\n  auto capital= entry.second-\u003ecapital;\n  if(capital==nullptr) return highPopulatedCapital;\n  auto population= capital-\u003epopulation;\n  if (highPopulatedCapital==nullptr){\n     highPopulatedCapital= capital;\n  } else  if (highPopulatedCapital-\u003epopulation\u003cpopulation) {\n     highPopulatedCapital= capital;\n                }\n         return highPopulatedCapital;\n }; \n \n auto highPopulatedCapital = accumulate(countries.begin(),countries.end(),shared_ptr\u003ccity\u003e(nullptr),highPopulatedCapitalReducer).get();\n\n        cout \u003c\u003c *highPopulatedCapital \u003c\u003c endl;   \n  \n        return 0;\n}\n```\n\nYukarıdaki uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz:\n\n```\n$ ./exercise8\nCreating cities...done.\nCreating countries...done.\ncity [ id=2331, name=Seoul, country [ code=KOR, name=South Korea, population=46844000, surface_area=99434, gnp=320749, continent=Asia, # of cities= 0 ], population=9981619 ]\n```\n\n## Ranges\n\nYukarıdaki örnek problemlerin çözümünde STL kütüphanesini ve fonksiyonel programlamayı kullanmış olmak, kodlama üretkenliğimizi iyileştirmiş olsa da hala her çözümde tekrar ettiğimiz noktalar bulunuyor. Üstelik STL torbalaları üzerinde yaptığımız işlemlerin bellek kullanımı ve çalışma zamanı başarımında problemler bulunuyor. Bu problemlerin çözümü için geliştirilen iki kütüphane bulunuyor:\n\n- Boost Range 2.0\n- Range 3.0\n\nİkinci çözüm Eric Niebler'e ait ve C++20 standardına eklenmek üzere kabul edilmiş durumda. 2020 yılında çıkacak C++'ın yeni sürümünde hazır olarak ulaşacağımız bir çözüm sunuyor. Eğer C++14 ve sonrası bir C++ derleyiciniz varsa şimdiden kullanabilirsiniz. Şimdi yukarıda çözdüğümüz problemlerin bir kaçını tekrar ele alalım ve Range v3 ile tekrar çözelim:\n\n1. Asya kıtasındaki ülkelerin bir listesini almak istiyoruz:\n\nranges1.cpp:\n\n``` cpp\n#include \"city.h\"\n#include \"country.h\"\n#include \"world-util.h\"\n\n#include \u003cvector\u003e\n#include \u003cfunctional\u003e\n#include \u003cmap\u003e\n#include \u003ciostream\u003e\n#include \u003cstring\u003e\n#include \u003cmemory\u003e\n\n#include \u003crange/v3/core.hpp\u003e\n#include \u003crange/v3/view/transform.hpp\u003e\n#include \u003crange/v3/view/map.hpp\u003e\n#include \u003crange/v3/view/view.hpp\u003e\n#include \u003crange/v3/view/filter.hpp\u003e\n#include \u003crange/v3/algorithm/for_each.hpp\u003e\n\nusing namespace std;\nusing namespace world;\nusing namespace ranges::v3;\n\nstd::map\u003cint,std::shared_ptr\u003cworld::city\u003e\u003e cities;\nstd::map\u003cstd::string,std::shared_ptr\u003cworld::country\u003e\u003e countries;\n\nint main(int argc, char* argv[]){\n    create_world();\n    auto is_asian = [](shared_ptr\u003ccountry\u003e \u0026a_country) -\u003e bool {\n        return a_country-\u003econtinent.compare(\"Asia\") == 0;\n    };\n    const auto asian_countries=countries | view::values | view::filter(is_asian) | to_vector ;\n    for (auto\u0026 a_country : asian_countries)\n        cout \u003c\u003c *a_country \u003c\u003c endl;   \n    return 0;\n}\n```\n\n2. Ülkelerin adlarından oluşan bir liste oluşturmak istiyoruz:\n\nranges2.cpp:\n\n``` cpp\n#include \"city.h\"\n#include \"country.h\" \n#include \"world-util.h\" \n\n#include \u003cvector\u003e\n#include \u003cfunctional\u003e\n#include \u003cmap\u003e\n#include \u003ciostream\u003e\n#include \u003cstring\u003e\n#include \u003cmemory\u003e\n\n#include \u003crange/v3/core.hpp\u003e\n#include \u003crange/v3/view/transform.hpp\u003e\n#include \u003crange/v3/view/map.hpp\u003e\n#include \u003crange/v3/view/view.hpp\u003e\n#include \u003crange/v3/view/filter.hpp\u003e\n#include \u003crange/v3/algorithm/for_each.hpp\u003e\n\nusing namespace std;\nusing namespace world;\nusing namespace ranges::v3;\n\nstd::map\u003cint,std::shared_ptr\u003cworld::city\u003e\u003e cities;\nstd::map\u003cstd::string,std::shared_ptr\u003cworld::country\u003e\u003e countries;\n\nint main(int argc, char* argv[]){\n    create_world();\n    auto country_name_mapper = [](shared_ptr\u003ccountry\u003e \u0026a_country) -\u003e string {\n        return a_country-\u003ename ;\n    };\n\n    const auto countries_names= countries | view::values | view::transform(country_name_mapper) | to_vector ;\n\n    for (auto\u0026 country_name : countries_names)\n        cout \u003c\u003c country_name \u003c\u003c endl; \n\n    return 0;\n}\n```\n\n3. Dünya ülkelerini, GNP değerleri 25000'nin altında olan ülkeler ve 25000'nin üstünde olan ülkeler olarak iki sınıfta gruplayalım:\n\nranges3.cpp:\n\n```\n#include \"city.h\"\n#include \"country.h\" \n#include \"world-util.h\" \n\n#include \u003cvector\u003e\n#include \u003cfunctional\u003e\n#include \u003cmap\u003e\n#include \u003ciostream\u003e\n#include \u003cstring\u003e\n#include \u003cmemory\u003e\n#include \u003crange/v3/core.hpp\u003e\n#include \u003crange/v3/view/transform.hpp\u003e\n#include \u003crange/v3/view/map.hpp\u003e\n#include \u003crange/v3/view/group_by.hpp\u003e\n#include \u003crange/v3/view/all.hpp\u003e\n#include \u003crange/v3/view/join.hpp\u003e\n#include \u003crange/v3/view/view.hpp\u003e\n#include \u003crange/v3/action/sort.hpp\u003e\n#include \u003crange/v3/view/filter.hpp\u003e\n#include \u003crange/v3/algorithm/for_each.hpp\u003e\n\nusing namespace std;\nusing namespace world;\nusing namespace ranges;\n\nstd::map\u003cint,std::shared_ptr\u003cworld::city\u003e\u003e cities;\nstd::map\u003cstd::string,std::shared_ptr\u003cworld::country\u003e\u003e countries;\n\nauto group_by_gnp() {\n   return \n   view::group_by(\n          [](shared_ptr\u003ccountry\u003e a,shared_ptr\u003ccountry\u003e b) -\u003e bool {\n              auto is_a_rich= a-\u003egnp \u003e= 25000.0 ; \n              auto is_b_rich= b-\u003egnp \u003e= 25000.0 ; \n              return is_a_rich == is_b_rich ;\n          }\n   );\n}\n\nauto order_by_gnp = [](shared_ptr\u003ccountry\u003e \u0026a,shared_ptr\u003ccountry\u003e \u0026b) -\u003e bool {\n     return a-\u003egnp \u003c b-\u003egnp ;\n};\n\nint main(int argc, char* argv[]){\n\n    create_world();\n    auto all= countries | view::values | to_vector | action::sort(order_by_gnp);\n    auto rich_poor_countries= all | group_by_gnp() ;\n    RANGES_FOR(auto cluster, rich_poor_countries)\n    {\n        RANGES_FOR(auto c, cluster)\n        {\n            cout \u003c\u003c *c \u003c\u003c endl;\n        }\n        cout \u003c\u003c endl;\n    }\n\n    return 0;\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeepcloudlabs%2Fdcl113-2023-aug-14","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeepcloudlabs%2Fdcl113-2023-aug-14","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeepcloudlabs%2Fdcl113-2023-aug-14/lists"}