{"id":1757,"date":"2021-02-22T14:25:36","date_gmt":"2021-02-22T19:25:36","guid":{"rendered":"http:\/\/www.jaimerios.com\/?p=1757"},"modified":"2025-12-02T23:37:28","modified_gmt":"2025-12-02T23:37:28","slug":"using-c-stdmerge","status":"publish","type":"post","link":"https:\/\/jaimerios.com\/?p=1757","title":{"rendered":"Using C++ std::merge"},"content":{"rendered":"\n<p>There have been a few times that I needed 2 vectors to be \u2026 <code>merged<\/code>\u2026 and they had to be ordered.<\/p>\n\n\n\n<p>It&#8217;s simple when you have a plain old type, and are using the <code>back_inserter<\/code> to append the contents of each vector to the end of the merged vector, but what if you want to use your custom class? And what if you need a custom means to sort the merged vector?<\/p>\n\n\n\n<p>You can use a predicate function to put the items in the correct order in the merged vector.<\/p>\n\n\n\n<p>The format for the predicate function is <code>bool FunctionName(const T&amp; a, const T&amp; b)<\/code> where T is the custom type that you are working with.<\/p>\n\n\n\n<p>In the example I provide, I&#8217;m using a lambda, and the custom class is <code>task<\/code>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4\"><span style=\"border-bottom:1px solid rgba(234, 191, 191, 0.2)\">C++<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Returns ?true if the first argument should be ordered before the second argument\nauto cmp = [](const std::shared_ptr&lt;task> &amp;a, const std::shared_ptr&lt;task> &amp;b) -> bool {\n\/\/ returns ?true if the first argument is less than (i.e. is ordered before) the second.\nif (a->get_due_by() == b->get_due_by())\n    return a->get_priority() > b->get_priority();\n\nreturn (a->get_due_by() &lt; b->get_due_by());\n};<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Returns ?true if the first argument should be ordered before the second argument<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> cmp = [](<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">shared_ptr<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">task<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">a<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">shared_ptr<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">task<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">b<\/span><span style=\"color: #D4D4D4\">) -&gt; <\/span><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ returns ?true if the first argument is less than (i.e. is ordered before) the second.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">a<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">get_due_by<\/span><span style=\"color: #D4D4D4\">() == <\/span><span style=\"color: #9CDCFE\">b<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">get_due_by<\/span><span style=\"color: #D4D4D4\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">a<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">get_priority<\/span><span style=\"color: #D4D4D4\">() &gt; <\/span><span style=\"color: #9CDCFE\">b<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">get_priority<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">a<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">get_due_by<\/span><span style=\"color: #D4D4D4\">() &lt; <\/span><span style=\"color: #9CDCFE\">b<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">get_due_by<\/span><span style=\"color: #D4D4D4\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>The example I wrote up is a simple todo list, with 2 vectors, one holding my personal tasks and a second holding work tasks.<\/p>\n\n\n\n<p>I sort both of the vectors before merging them, which is actually an important step:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4\"><span style=\"border-bottom:1px solid rgba(234, 191, 191, 0.2)\">C++<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>std::sort(personal_tasks.begin(), personal_tasks.end(), cmp);\nstd::sort(work_tasks.begin(), work_tasks.end(), cmp);<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">sort<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">personal_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">begin<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">personal_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">end<\/span><span style=\"color: #D4D4D4\">(), cmp);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">sort<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">work_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">begin<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">work_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">end<\/span><span style=\"color: #D4D4D4\">(), cmp);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>And then to merge the 2 vectors, you use the templated merge function:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4\"><span style=\"border-bottom:1px solid rgba(234, 191, 191, 0.2)\">C++<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Create another vector, which is big enough to accept the 2 vectors.\ntodos_t merged_tasks(personal_tasks.size() + work_tasks.size(), std::shared_ptr&lt;task>());\nstd::merge(personal_tasks.begin(), personal_tasks.end(), work_tasks.begin(), work_tasks.end(), merged_tasks.begin(), cmp);<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Create another vector, which is big enough to accept the 2 vectors.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">todos_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">merged_tasks<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">personal_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">size<\/span><span style=\"color: #D4D4D4\">() + <\/span><span style=\"color: #4EC9B0\">work_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">size<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">shared_ptr<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">task<\/span><span style=\"color: #D4D4D4\">&gt;());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">merge<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">personal_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">begin<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">personal_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">end<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">work_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">begin<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">work_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">end<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">merged_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">begin<\/span><span style=\"color: #D4D4D4\">(), cmp);<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>That&#8217;s about it.<\/p>\n\n\n\n<p>Below is the complete source file.<\/p>\n\n\n\n<p>I used CMake to build the project. For those who don&#8217;t know how to use CMake, there are a lot of resources on the internet to use it.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4\"><span style=\"border-bottom:1px solid rgba(234, 191, 191, 0.2)\">C++<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>#include &lt;algorithm>\n#include &lt;iostream>\n#include &lt;iterator>\n#include &lt;memory>\n#include &lt;vector>\n\n\/************************************************************************\/\nenum class priority_t : int\n{\n  unknown = 0,\n  low,\n  medium,\n  high\n};\n\n\/************************************************************************\/\nstd::string get_priority_name(const priority_t &amp;priority)\n{\n  switch (priority)\n  {\n  case priority_t::unknown:\n    return \"Unknown\";\n  case priority_t::low:\n    return \"Low\";\n  case priority_t::medium:\n    return \"Medium\";\n  case priority_t::high:\n    return \"High\";\n  default:\n    return \"\";\n  }\n}\n\n\/************************************************************************\/\nclass task\n{\npublic:\n  task(const std::string &amp;desc, const time_t &amp;due_by, const priority_t &amp;priority)\n      : m_desc(desc), m_due_by(due_by), m_priority(priority)\n  {\n    ;\n  }\n\n  ~task() { ; }\n\n  std::string_view get_desc() const { return m_desc; }\n  time_t           get_due_by() const { return m_due_by; }\n  priority_t       get_priority() const { return m_priority; }\n\nprivate:\n  task() { ; }\n\n  std::string m_desc;\n  time_t      m_due_by;\n  priority_t  m_priority = priority_t::unknown;\n};\n\nusing todos_t = std::vector&lt;std::shared_ptr&lt;task>>;\n\n\/************************************************************************\n Creates a time_t using the supplied hour and minute.\n The date will be set to the current date.\n*\/\ntime_t create_time(const int hour, const int minute)\n{\n  \/\/ Get the current UTC time\n  time_t result;\n  time(&amp;result);\n\n  \/\/ Set up a tm struct so that we can mod the hour and minutes\n  struct tm *timeinfo;\n  timeinfo = localtime(&amp;result);\n\n  timeinfo->tm_hour = hour;\n  timeinfo->tm_min  = minute;\n\n  \/\/ Fill in the struct and return the time_t\n  return mktime(timeinfo);\n}\n\n\/************************************************************************\n Helper function to reduce the clutter in the code.\n This is just an example, so we are using the current year-month-day.\n*\/\nvoid add_task(todos_t &amp;container, const std::string desc, const int hour, const int minute, const priority_t priority)\n{\n  container.push_back(std::make_shared&lt;task>(desc, create_time(hour, minute), priority));\n}\n\n\/************************************************************************\/\nint main(int, char **)\n{\n  todos_t personal_tasks;\n  add_task(personal_tasks, \"Meditate (3)\", 12, 30, priority_t::medium);\n  add_task(personal_tasks, \"Answer emails (3)\", 12, 30, priority_t::low);\n  add_task(personal_tasks, \"Go to gym (0)\", 7, 30, priority_t::high);\n\n  todos_t work_tasks;\n  add_task(work_tasks, \"Respond to Slack messages (1)\", 9, 00, priority_t::low);\n  add_task(work_tasks, \"Gossip at watercooler (4)\", 13, 00, priority_t::unknown);\n  add_task(work_tasks, \"Implement new qsort that is actually readable (2)\", 11, 00, priority_t::medium);\n\n  \/\/ Returns ?true if the first argument is less than (i.e. is ordered before) the second.\n  auto cmp = [](const std::shared_ptr&lt;task> &amp;a, const std::shared_ptr&lt;task> &amp;b) -> bool {\n    \/\/ returns ?true if the first argument is less than (i.e. is ordered before) the second.\n    if (a->get_due_by() == b->get_due_by())\n      return a->get_priority() > b->get_priority();\n\n    return (a->get_due_by() &lt; b->get_due_by());\n  };\n\n  std::sort(personal_tasks.begin(), personal_tasks.end(), cmp);\n  std::sort(work_tasks.begin(), work_tasks.end(), cmp);\n\n  \/\/ Create another vector, which is big enough to accept the 2 vectors.\n  todos_t merged_tasks(personal_tasks.size() + work_tasks.size(), std::shared_ptr&lt;task>());\n  std::merge(personal_tasks.begin(), personal_tasks.end(), work_tasks.begin(), work_tasks.end(), merged_tasks.begin(), cmp);\n\n  printf(\"%-60s %-20s %-20s \\n\", \"Desc\", \"Priority\", \"Datetime\");\n\n  for (const auto &amp;item : merged_tasks)\n  {\n    time_t val = item->get_due_by();\n    printf(\"%-60s %-20s %-20s\", item->get_desc().data(), get_priority_name(item->get_priority()).c_str(), ctime(&amp;val));\n  }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;algorithm&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;iterator&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;memory&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;vector&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/************************************************************************\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">enum<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\"> : <\/span><span style=\"color: #569CD6\">int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4FC1FF\">unknown<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4FC1FF\">low<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4FC1FF\">medium<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4FC1FF\">high<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/************************************************************************\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">get_priority_name<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">priority<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">switch<\/span><span style=\"color: #D4D4D4\"> (priority)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">case<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\">::unknown:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;Unknown&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">case<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\">::low:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;Low&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">case<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\">::medium:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;Medium&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">case<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\">::high:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;High&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">default<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;&quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/************************************************************************\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">task<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">public:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">task<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">desc<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">time_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">due_by<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">priority<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      : <\/span><span style=\"color: #DCDCAA\">m_desc<\/span><span style=\"color: #D4D4D4\">(desc), <\/span><span style=\"color: #DCDCAA\">m_due_by<\/span><span style=\"color: #D4D4D4\">(due_by), <\/span><span style=\"color: #DCDCAA\">m_priority<\/span><span style=\"color: #D4D4D4\">(priority)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">~task<\/span><span style=\"color: #D4D4D4\">() { ; }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">string_view<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">get_desc<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> m_desc; }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">time_t<\/span><span style=\"color: #D4D4D4\">           <\/span><span style=\"color: #DCDCAA\">get_due_by<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> m_due_by; }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #DCDCAA\">get_priority<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> m_priority; }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">private:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">task<\/span><span style=\"color: #D4D4D4\">() { ; }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::string m_desc;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">time_t<\/span><span style=\"color: #D4D4D4\">      m_due_by;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\">  m_priority = <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\">::unknown;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">using<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">todos_t<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">vector<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">shared_ptr<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">task<\/span><span style=\"color: #D4D4D4\">&gt;&gt;;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/************************************************************************<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> Creates a time_t using the supplied hour and minute.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> The date will be set to the current date.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">*\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">time_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">create_time<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">hour<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">minute<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Get the current UTC time<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">time_t<\/span><span style=\"color: #D4D4D4\"> result;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">time<\/span><span style=\"color: #D4D4D4\">(&amp;result);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Set up a tm struct so that we can mod the hour and minutes<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">struct<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">tm<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">*<\/span><span style=\"color: #9CDCFE\">timeinfo<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  timeinfo = <\/span><span style=\"color: #DCDCAA\">localtime<\/span><span style=\"color: #D4D4D4\">(&amp;result);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">timeinfo<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #9CDCFE\">tm_hour<\/span><span style=\"color: #D4D4D4\"> = hour;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">timeinfo<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #9CDCFE\">tm_min<\/span><span style=\"color: #D4D4D4\">  = minute;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Fill in the struct and return the time_t<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">mktime<\/span><span style=\"color: #D4D4D4\">(timeinfo);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/************************************************************************<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> Helper function to reduce the clutter in the code.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"> This is just an example, so we are using the current year-month-day.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">*\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">add_task<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">todos_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">container<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">desc<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">hour<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">minute<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">priority<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">container<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">push_back<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">make_shared<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">task<\/span><span style=\"color: #D4D4D4\">&gt;(desc, <\/span><span style=\"color: #DCDCAA\">create_time<\/span><span style=\"color: #D4D4D4\">(hour, minute), priority));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/************************************************************************\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">main<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">char<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">**<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">todos_t<\/span><span style=\"color: #D4D4D4\"> personal_tasks;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">add_task<\/span><span style=\"color: #D4D4D4\">(personal_tasks, <\/span><span style=\"color: #CE9178\">&quot;Meditate (3)&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">12<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\">::medium);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">add_task<\/span><span style=\"color: #D4D4D4\">(personal_tasks, <\/span><span style=\"color: #CE9178\">&quot;Answer emails (3)&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">12<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\">::low);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">add_task<\/span><span style=\"color: #D4D4D4\">(personal_tasks, <\/span><span style=\"color: #CE9178\">&quot;Go to gym (0)&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\">::high);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">todos_t<\/span><span style=\"color: #D4D4D4\"> work_tasks;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">add_task<\/span><span style=\"color: #D4D4D4\">(work_tasks, <\/span><span style=\"color: #CE9178\">&quot;Respond to Slack messages (1)&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">9<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">00<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\">::low);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">add_task<\/span><span style=\"color: #D4D4D4\">(work_tasks, <\/span><span style=\"color: #CE9178\">&quot;Gossip at watercooler (4)&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">13<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">00<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\">::unknown);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">add_task<\/span><span style=\"color: #D4D4D4\">(work_tasks, <\/span><span style=\"color: #CE9178\">&quot;Implement new qsort that is actually readable (2)&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">11<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">00<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #4EC9B0\">priority_t<\/span><span style=\"color: #D4D4D4\">::medium);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Returns ?true if the first argument is less than (i.e. is ordered before) the second.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> cmp = [](<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">shared_ptr<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">task<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">a<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">shared_ptr<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">task<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">b<\/span><span style=\"color: #D4D4D4\">) -&gt; <\/span><span style=\"color: #569CD6\">bool<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">    \/\/ returns ?true if the first argument is less than (i.e. is ordered before) the second.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">a<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">get_due_by<\/span><span style=\"color: #D4D4D4\">() == <\/span><span style=\"color: #9CDCFE\">b<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">get_due_by<\/span><span style=\"color: #D4D4D4\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">a<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">get_priority<\/span><span style=\"color: #D4D4D4\">() &gt; <\/span><span style=\"color: #9CDCFE\">b<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">get_priority<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">a<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">get_due_by<\/span><span style=\"color: #D4D4D4\">() &lt; <\/span><span style=\"color: #9CDCFE\">b<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">get_due_by<\/span><span style=\"color: #D4D4D4\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  };<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">sort<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">personal_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">begin<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">personal_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">end<\/span><span style=\"color: #D4D4D4\">(), cmp);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">sort<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">work_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">begin<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">work_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">end<\/span><span style=\"color: #D4D4D4\">(), cmp);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Create another vector, which is big enough to accept the 2 vectors.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">todos_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">merged_tasks<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">personal_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">size<\/span><span style=\"color: #D4D4D4\">() + <\/span><span style=\"color: #9CDCFE\">work_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">size<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">shared_ptr<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">task<\/span><span style=\"color: #D4D4D4\">&gt;());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">merge<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">personal_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">begin<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">personal_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">end<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">work_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">begin<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">work_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">end<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">merged_tasks<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">begin<\/span><span style=\"color: #D4D4D4\">(), cmp);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">printf<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #9CDCFE\">%-60s<\/span><span style=\"color: #CE9178\"> <\/span><span style=\"color: #9CDCFE\">%-20s<\/span><span style=\"color: #CE9178\"> <\/span><span style=\"color: #9CDCFE\">%-20s<\/span><span style=\"color: #CE9178\"> <\/span><span style=\"color: #D7BA7D\">\\n<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;Desc&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;Priority&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;Datetime&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> &amp;item : merged_tasks)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">time_t<\/span><span style=\"color: #D4D4D4\"> val = <\/span><span style=\"color: #9CDCFE\">item<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">get_due_by<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">printf<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #9CDCFE\">%-60s<\/span><span style=\"color: #CE9178\"> <\/span><span style=\"color: #9CDCFE\">%-20s<\/span><span style=\"color: #CE9178\"> <\/span><span style=\"color: #9CDCFE\">%-20s<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">item<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">get_desc<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #DCDCAA\">data<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #DCDCAA\">get_priority_name<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">item<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">get_priority<\/span><span style=\"color: #D4D4D4\">()).<\/span><span style=\"color: #DCDCAA\">c_str<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #DCDCAA\">ctime<\/span><span style=\"color: #D4D4D4\">(&amp;val));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Here is a minimal CMakeLists.txt file to build the above code:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4\"><span style=\"border-bottom:1px solid rgba(234, 191, 191, 0.2)\">CMake<\/span><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>cmake_minimum_required(VERSION 3.0.0)\nproject(merge_example VERSION 0.1.0)\n\nset(CMAKE_C_STANDARD 11)\nset(CMAKE_CXX_STANDARD 20)\n\ninclude(CTest)\nenable_testing()\n\nadd_executable(merge_example main.cpp)\n\nset(CPACK_PROJECT_NAME ${PROJECT_NAME})\nset(CPACK_PROJECT_VERSION ${PROJECT_VERSION})\ninclude(CPack)<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">cmake_minimum_required<\/span><span style=\"color: #D4D4D4\">(VERSION 3.0.0)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">project<\/span><span style=\"color: #D4D4D4\">(merge_example VERSION 0.1.0)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\">(CMAKE_C_STANDARD 11)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\">(CMAKE_CXX_STANDARD 20)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">include<\/span><span style=\"color: #D4D4D4\">(CTest)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">enable_testing<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">add_executable<\/span><span style=\"color: #D4D4D4\">(merge_example main.cpp)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\">(CPACK_PROJECT_NAME <\/span><span style=\"color: #569CD6\">${PROJECT_NAME}<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">set<\/span><span style=\"color: #D4D4D4\">(CPACK_PROJECT_VERSION <\/span><span style=\"color: #569CD6\">${PROJECT_VERSION}<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">include<\/span><span style=\"color: #D4D4D4\">(CPack)<\/span><\/span><\/code><\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>There have been a few times that I needed 2 vectors to be \u2026 merged\u2026 and they had to be ordered. It&#8217;s simple when you have a plain old type, and are using the back_inserter to append the contents of each vector to the end of the merged vector, but what if you want to &#8230; <a title=\"Using C++ std::merge\" class=\"read-more\" href=\"https:\/\/jaimerios.com\/?p=1757\" aria-label=\"Read more about Using C++ std::merge\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[143,420],"class_list":["post-1757","post","type-post","status-publish","format-standard","hentry","category-coding","tag-cpp","tag-stdmerge"],"_links":{"self":[{"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/posts\/1757","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jaimerios.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1757"}],"version-history":[{"count":1,"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/posts\/1757\/revisions"}],"predecessor-version":[{"id":1894,"href":"https:\/\/jaimerios.com\/index.php?rest_route=\/wp\/v2\/posts\/1757\/revisions\/1894"}],"wp:attachment":[{"href":"https:\/\/jaimerios.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1757"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jaimerios.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1757"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jaimerios.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1757"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}