<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3900740</guid>
        <pubDate>Sat, 24 Feb 2024 18:02:29 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3900740</link>
        <description><![CDATA[shm: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441411&view=findpost&p=3899259'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-01-24T16:43:47+03:00">24.01.24, 13:43</time></span><div class='quote '>Дубль цифры &quot;1&quot;</div></div><br>
Небольшой фикс<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;vector&#62;</div><div class="code_line">#include &#60;algorithm&#62;</div><div class="code_line">#include &#60;string&#62;</div><div class="code_line">#include &#60;unordered_set&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">int main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;const std::vector&#60;std::string&#62; arr = {&quot;1.12.1&quot;, &quot;2.4.15&quot;, &quot;1.11.1&quot;, &quot;33.4&quot;};</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::vector&#60;std::vector&#60;int&#62;&#62; int_arr;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::vector&#60;std::vector&#60;int&#62;&#62; int_out_arr;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::vector&#60;std::string&#62; out_arr;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const std::string&amp; s : arr)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::vector&#60;int&#62; x;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;size_t i = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for ( ; ; )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const size_t j = s.find(&#39;.&#39;, i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;x.emplace_back(std::stoi(s.substr(i, j != std::string::npos ? (j - i) : j)));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (j == std::string::npos)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i = j + 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int_arr.emplace_back(std::move(x));</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::sort(int_arr.begin(), int_arr.end());</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (size_t i = 0; i &#60; int_arr.size(); ++i)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;size_t j = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (i != 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{ &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const size_t min_len = std::min(int_arr[i].size(), int_arr[i - 1].size());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for ( ; j &#60; min_len; ++j)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (int_arr[i][j] != int_arr[i - 1][j])</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (++j; j &#60;= int_arr[i].size(); ++j)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int_out_arr.emplace_back(std::vector&#60;int&#62;(int_arr[i].begin(), int_arr[i].begin() + j));</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::sort(int_out_arr.begin(), int_out_arr.end(), [](const std::vector&#60;int&#62;&amp;a, const std::vector&#60;int&#62;&amp;b){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (a.size() == b.size())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return a &#60; b;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return a.size() &#62; b.size();</div><div class="code_line">&nbsp;&nbsp; &nbsp;});</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const std::vector&#60;int&#62;&amp; line : int_out_arr)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::string s;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (int value : line)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!s.empty())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;s += &#39;.&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;s += std::to_string(value);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;out_arr.emplace_back(std::move(s));</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const std::string&amp; s : out_arr)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; s &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899939</guid>
        <pubDate>Wed, 07 Feb 2024 13:12:19 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899939</link>
        <description><![CDATA[Qraizer: Компилил в C++17, пропустил typename впереди.<br>Вообще, изначально было C++14, но понадобилось structure binding, чтобы избавиться от уродливого std::tie().]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899896</guid>
        <pubDate>Wed, 07 Feb 2024 05:52:23 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899896</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441411&view=findpost&p=3899889'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-02-06T17:58:45+00:00">06.02.24, 17:58</time></span><div class='quote '>Собрано на коленке. Доводить до ума некогда, сорри.</div></div><br>
<a class='tag-url' href='https://onlinegdb.com/3sn-b5sGm' target='_blank'>Попробовал откомпилячить</a> в С++20 - выдает ошибки  :( <br>
<br>
Штото типа:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">main.cpp: In function ‘auto doTest(const T&amp;)’:</div><div class="code_line">main.cpp:108:7: error: need ‘typename’ before ‘decltype (product)::value_type’ because ‘decltype (product)’ is a dependent scope</div><div class="code_line">&nbsp;&nbsp;108 | &nbsp; &nbsp; &nbsp; decltype(product)::value_type newItem; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// чем добавлять все, кроме последнего</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; ^~~~~~~~~~~~~~~~~</div><div class="code_line">main.cpp:108:36: error: expected ‘;’ before ‘newItem’</div><div class="code_line">&nbsp;&nbsp;108 | &nbsp; &nbsp; &nbsp; decltype(product)::value_type newItem; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// чем добавлять все, кроме последнего</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^~~~~~~~</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;</div><div class="code_line">main.cpp:111:32: error: ‘newItem’ was not declared in this scope</div><div class="code_line">&nbsp;&nbsp;111 | &nbsp; &nbsp; &nbsp; &nbsp; selector_type::addItem(newItem, selector_type::getItem(i, k));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^~~~~~~</div><div class="code_line">main.cpp:112:22: error: ‘newItem’ was not declared in this scope</div><div class="code_line">&nbsp;&nbsp;112 | &nbsp; &nbsp; &nbsp; product.insert(newItem); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// добавить в результат</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^~~~~~~</div><div class="code_line">main.cpp: In instantiation of ‘auto doTest(const T&amp;) [with T = std::vector&#60;std::vector&#60;int&#62; &#62;]’:</div><div class="code_line">main.cpp:121:31: &nbsp; required from here</div><div class="code_line">main.cpp:108:26: error: dependent-name ‘decltype (product)::value_type’ is parsed as a non-type, but instantiation yields a type</div><div class="code_line">&nbsp;&nbsp;108 | &nbsp; &nbsp; &nbsp; decltype(product)::value_type newItem; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// чем добавлять все, кроме последнего</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^~~~~~~~~~</div><div class="code_line">main.cpp:108:26: note: say ‘typename decltype (product)::value_type’ if a type is meant</div><div class="code_line">main.cpp: In instantiation of ‘auto doTest(const T&amp;) [with T = std::vector&#60;std::__cxx11::basic_string&#60;char&#62; &#62;]’:</div><div class="code_line">main.cpp:137:31: &nbsp; required from here</div><div class="code_line">main.cpp:108:26: error: dependent-name ‘decltype (product)::value_type’ is parsed as a non-type, but instantiation yields a type</div><div class="code_line">main.cpp:108:26: note: say ‘typename decltype (product)::value_type’ if a type is meant</div></ol></div></div></div></div><br>
 :-?]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899895</guid>
        <pubDate>Tue, 06 Feb 2024 19:07:43 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899895</link>
        <description><![CDATA[Qraizer: На вот для примера.<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;std::list&#60;std::valarray&#60;int&#62;&#62; super({{1,12}, {2,4,15}, {111,1,1}, {3,4}, {1,1}});</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;auto res = doTest(super);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// вывод</div><div class="code_line">&nbsp;&nbsp;for (const auto&amp; i : res)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &#39;{&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const auto&amp; j : i)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;std::cout &#60;&#60; &#39; &#39; &#60;&#60; j &#60;&#60; &#39; &#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;};&quot;;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; std::endl;</div></ol></div></div></div></div>Список std::valarray&lt;&gt;ев. :lol: Всего-то понадобилось:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// стратегия для недоSIMDей</div><div class="code_line">struct ValArrayAccessor</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;using value_type = std::valarray&#60;int&#62;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;static size_t getSize(const value_type&amp; cont) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { return cont.size(); &nbsp;}</div><div class="code_line">&nbsp;&nbsp;static int &nbsp; &nbsp;getItem(const value_type&amp; cont, size_t idx) { return cont[idx]; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;static void &nbsp; addItem( &nbsp; &nbsp; &nbsp;value_type&amp; cont, int &nbsp; &nbsp;val)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;value_type newCont(cont.size()+1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::slice toCopy(0, cont.size(), 1);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;newCont[toCopy] = cont[toCopy];</div><div class="code_line">&nbsp;&nbsp; &nbsp;newCont[newCont.size()-1] = val;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::swap(newCont, cont);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">template &#60;&#62; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; struct Selector&#60;std::valarray&#60;int&#62;&#62;</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;using ValueType = ValArrayAccessor;</div><div class="code_line">};</div></ol></div></div></div></div>Вроде даже работает. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-02-06T19:10:20+00:00">06.02.24, 19:10</time></span></span><br>
Что там на очереди? std::queue&lt;std::tuple&lt;&gt;&gt;? :crazy:]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899894</guid>
        <pubDate>Tue, 06 Feb 2024 18:35:04 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899894</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441411&view=findpost&p=3899893'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-02-06T18:26:39+00:00">06.02.24, 18:26</time></span><div class='quote '>Ну и зря. Тут вся сложность в алгоритме компаратора.</div></div><br>
Ну что тут сказать ... я рад, что и ты тут нашел себе развлечение  :lol:]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899893</guid>
        <pubDate>Tue, 06 Feb 2024 18:26:39 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899893</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441411&view=findpost&p=3899890'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-02-06T18:11:22+00:00">06.02.24, 18:11</time></span><div class='quote '>Не не не ... я не пишу универсальную хрень - чисто разовый утиль. Написал-использовал-забыл.</div></div>Ну и зря. Тут вся сложность в алгоритме компаратора. Sorter&lt;&gt;::operator() который. Написать его совсем не сложно. Меня заинтересовало именно обобщённое решение для различных представлений. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-02-06T18:29:03+00:00">06.02.24, 18:29</time></span></span><br>
Потратил я, кстати, часа два. Сегодня после обеда решил передохнуть от дидлайна. Счас комментов только накидал.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899892</guid>
        <pubDate>Tue, 06 Feb 2024 18:20:52 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899892</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441411&view=findpost&p=3899891'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-02-06T18:15:13+00:00">06.02.24, 18:15</time></span><div class='quote '>Зато тут полноценное обобщённое решение.</div></div><br>
Ну если только для академических целей ...  :whistle:]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899891</guid>
        <pubDate>Tue, 06 Feb 2024 18:15:13 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899891</link>
        <description><![CDATA[Qraizer: P.S. Выглядит громоздко. Зато тут полноценное обобщённое решение. Для любого другого представления просто доопределяем политику struct blah_blah_blah_Accessor и однострочно специализируем Selector&lt;&gt;. М-м-м... doTest() должен справиться и без настройки, ему лишь бы контейнер какой-нить с begin()/end() дали. Наверное... <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-02-06T18:20:10+00:00">06.02.24, 18:20</time></span></span><br>
Собственно решение на ~100 строк, и оно, поверь, даже в таком виде быстрее за счёт отсутствия тяжёлых в ран-тайме сущностей. При этом это два решения сразу. Остальные строки только запускают этот код на разных примерах]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899890</guid>
        <pubDate>Tue, 06 Feb 2024 18:11:22 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899890</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441411&view=findpost&p=3899044'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-01-18T23:15:00+00:00">18.01.24, 23:15</time></span><div class='quote '>Нужен <strong class='tag-b'><span class="tag-color tag-color-named" data-value="red" style="color: red">компактный</span></strong> алгоритм на C++20 не выше</div></div> :lol: <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441411&view=findpost&p=3899889'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-02-06T17:58:45+00:00">06.02.24, 17:58</time></span><div class='quote '>Собрано на коленке.</div></div><br>
 :facepalm: ты спецом так раздул код? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-02-06T18:13:27+00:00">06.02.24, 18:13</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441411&view=findpost&p=3899889'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-02-06T17:58:45+00:00">06.02.24, 17:58</time></span><div class='quote '>Кстати, Majestio, где тест с мульёном вложений подразделов? А то 3 как-то несерьёзно.</div></div><br>
Не не не ... я не пишу универсальную хрень - чисто разовый утиль. Написал-использовал-забыл.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899889</guid>
        <pubDate>Tue, 06 Feb 2024 17:58:45 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899889</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441411&view=findpost&p=3899266'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-01-24T22:17:36+00:00">24.01.24, 22:17</time></span><div class='quote '>Perl красивше&#33;</div></div>Красивше русский. Особенно нелитературный. А Плюсы круче:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;vector&#62;</div><div class="code_line">#include &#60;string&#62;</div><div class="code_line">#include &#60;algorithm&#62;</div><div class="code_line">#include &#60;tuple&#62;</div><div class="code_line">#include &#60;set&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">// стратегия для векторов </div><div class="code_line">struct VectorAccessor</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;using value_type = std::vector&#60;int&#62;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;static size_t getSize(const value_type&amp; cont) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { return cont.size(); &nbsp;}</div><div class="code_line">&nbsp;&nbsp;static int &nbsp; &nbsp;getItem(const value_type&amp; cont, size_t idx) { return cont.at(idx); }</div><div class="code_line">&nbsp;&nbsp;static void &nbsp; addItem( &nbsp; &nbsp; &nbsp;value_type&amp; cont, int &nbsp; &nbsp;val) { cont.push_back(val); }</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">// стратегия для строк</div><div class="code_line">struct StringAccessor</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;using value_type = std::string;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;static size_t getSize(const value_type&amp; cont)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;return std::count(cont.begin(), cont.end(), &#39;.&#39;) + 1; &nbsp; &nbsp; &nbsp; // количество определяется точками</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;static int getItem(const value_type&amp; cont, size_t idx)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;auto getPosPoint =[&amp;](size_t idx) -&#62; std::string::size_type // ищем точку с номером idx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// условно номер 0 - это начало строки</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std::string::size_type pos = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (size_t i = 0; i &#60; idx; ++i)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos = cont.find(&#39;.&#39;, pos + 1);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return pos;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; };</div><div class="code_line">&nbsp;&nbsp; &nbsp;auto getPos = [&amp;](size_t idx) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ищем границы целого с номером idx</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std::string::size_type posL = getPosPoint(idx);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std::string::size_type posR = cont.find(&#39;.&#39;, posL + 1);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return std::make_tuple(posL, posR);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; };</div><div class="code_line">&nbsp;&nbsp; &nbsp;auto [pos1, pos2] = getPos(idx); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// получаем границы целого</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return std::stoul(cont.substr(pos1 == 0 ? 0 : pos1 + 1, pos2 - pos1)); // получаем целое</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;static void addItem(value_type&amp; cont, int val)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;cont += (cont.empty() ? &quot;&quot; : &quot;.&quot;) + std::to_string(val); &nbsp; &nbsp;// точка впереди не нужна</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">// селектор политик</div><div class="code_line">template &#60;typename T&#62; struct Selector;</div><div class="code_line">template &#60;&#62; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; struct Selector&#60;std::vector&#60;int&#62;&#62; { using ValueType = VectorAccessor; };</div><div class="code_line">template &#60;&#62; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; struct Selector&#60;std::string&#62; &nbsp; &nbsp; &nbsp;{ using ValueType = StringAccessor; };</div><div class="code_line">&nbsp;</div><div class="code_line">// это не моё</div><div class="code_line">using Vint = std::vector&#60;int&#62;;</div><div class="code_line">using Bolt = std::vector&#60;Vint&#62;;</div><div class="code_line">using Wood = std::vector&#60;std::string&#62;;</div><div class="code_line">&nbsp;</div><div class="code_line">Bolt raw &nbsp; = { {4,6}, {5,2}, {4,7,1}, {3,2,1}, {2,2} };</div><div class="code_line">Wood dirty = { &quot;4.6&quot;, &quot;5.2&quot;, &quot;4.7.1&quot;, &quot;3.2.1&quot;, &quot;2.2&quot; };</div><div class="code_line">&nbsp;</div><div class="code_line">// а это опять моё</div><div class="code_line">&nbsp;</div><div class="code_line">// Сравняльщик. Шаблонной лямбдой больно муторно</div><div class="code_line">template &#60;typename T&#62; struct Sorter</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;using selector = typename Selector&#60;typename T::value_type&#62;::ValueType; &nbsp; &nbsp; &nbsp; &nbsp;// политика</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// если длины разные, то меньше тот, кто длинее;</div><div class="code_line">&nbsp;&nbsp;// иначе меньше тот, чей int с наименьшим номером меньше, пока предыдущие int равны</div><div class="code_line">&nbsp;&nbsp;bool operator()(const typename selector::value_type&amp; left,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const typename selector::value_type&amp; right) const</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool res = selector::getSize(left) != selector::getSize(right); &nbsp; &nbsp; // сравнить длины</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (res) return selector::getSize(left) &#62; selector::getSize(right); // не равны.</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (size_t i = 0; i &#60; selector::getSize(left); ++i) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// иначе сравниваем int</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (selector::getItem(left, i) != selector::getItem(right, i)) &nbsp; &nbsp;// по порядку, пока равны.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return selector::getItem(left, i) &#60; selector::getItem(right, i);// меньший int меньше</div><div class="code_line">&nbsp;&nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">// получить результат из source</div><div class="code_line">template &#60;typename T&#62;</div><div class="code_line">auto doTest(const T&amp; source)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;std::multiset&#60;typename T::value_type, Sorter&#60;T&#62;&#62; heap(source.begin(), source.end()); &nbsp;// сортируем</div><div class="code_line">&nbsp;&nbsp;std::set &nbsp; &nbsp; &#60;typename T::value_type, Sorter&#60;T&#62;&#62; product;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;using selector_type = decltype(heap)::key_compare::selector; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// селектор</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// просто копируем source в результат поэлементно, попутно добавляем все подэлементы элемента</div><div class="code_line">&nbsp;&nbsp;// с меньшими длинами</div><div class="code_line">&nbsp;&nbsp;for (const auto&amp; i : heap)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;size_t j = selector_type::getSize(i); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // длина текущего элемента</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;product.insert(i); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// добавить элемент</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (--j != 0) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// перебрать подэлементы</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // конечно выгоднее удалять последний,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;decltype(product)::value_type newItem; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// чем добавлять все, кроме последнего</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// но лень переписывать политики</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for (size_t k = 0; k &#60; j; ++k) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// добавить все, кроме последнего</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;selector_type::addItem(newItem, selector_type::getItem(i, k));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;product.insert(newItem); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// добавить в результат</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;return product;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">// протестировать вектор векторов</div><div class="code_line">void testBold()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;const auto&amp; product = doTest(raw);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// вывод</div><div class="code_line">&nbsp;&nbsp;for (const auto&amp; i : product)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &#39;{&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const auto&amp; j : i)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;std::cout &#60;&#60; &#39; &#39; &#60;&#60; j &#60;&#60; &#39; &#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;};&quot;;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; std::endl;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">// протестировать вектор строк</div><div class="code_line">void testWood()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;const auto&amp; product = doTest(dirty);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// вывод</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; &#39;{&#39;;</div><div class="code_line">&nbsp;&nbsp;for (const auto&amp; i : product)</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &#39; &#39; &#60;&#60; i &#60;&#60; &#39; &#39;;</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; &quot;};&quot;;</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; std::endl;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;testBold();</div><div class="code_line">&nbsp;&nbsp;testWood();</div><div class="code_line">&nbsp;&nbsp;dirty = {&quot;1.12.1&quot;, &quot;2.4.15&quot;, &quot;1.11.1&quot;, &quot;33.4&quot;}; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // и это тоже не моё</div><div class="code_line">&nbsp;&nbsp;testWood();</div><div class="code_line">&nbsp;&nbsp;dirty = {&quot;1.12&quot;, &quot;2.4.15&quot;, &quot;111.1.1&quot;, &quot;3.4&quot;, &quot;1.1&quot;}; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// ну вы поняли</div><div class="code_line">&nbsp;&nbsp;testWood();</div><div class="code_line">}</div></ol></div></div></div></div>Совершенно неоптимизировано. Собрано на коленке. Доводить до ума некогда, сорри. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-02-06T18:05:38+00:00">06.02.24, 18:05</time></span></span><br>
Огромный простор для оптимизации. Особенно в Sorter&lt;&gt;::operator(), где можно закешировать всё, превратив Sorter&lt;&gt; в полноценный прокси. Зато сейчас все вспомогательные сущности иммутабельные, кому-то так больше нравится. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-02-06T18:10:25+00:00">06.02.24, 18:10</time></span></span><br>
Кстати, <strong class='tag-b'>Majestio</strong>, где тест с мульёном вложений подразделов? А то 3 как-то несерьёзно.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899266</guid>
        <pubDate>Wed, 24 Jan 2024 22:17:36 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899266</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441411&view=findpost&p=3899265'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-01-24T17:13:32+00:00">24.01.24, 17:13</time></span><div class='quote '>От счас ещё пару постов и ей-богу захочется самому пописа́ть. А некогда, дидлаим.</div></div><br>
Ну я вроде порешал этот вопрос  :-? <br>
<br>
<strong class='tag-b'>Perl</strong><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#!/usr/bin/perl</div><div class="code_line">&nbsp;</div><div class="code_line">use strict;</div><div class="code_line">use warnings;</div><div class="code_line">use v5.24;</div><div class="code_line">&nbsp;</div><div class="code_line">my @Arr = (&#39;1.12&#39;, &#39;2.4.15&#39;, &#39;111.1.1&#39;, &#39;3.4&#39;, &#39;1.1&#39;);</div><div class="code_line">my @Res = ();</div><div class="code_line">&nbsp;</div><div class="code_line"># если задан массив в &quot;точечной нотации&quot; преобразуем в массив массивов</div><div class="code_line">&nbsp;</div><div class="code_line">my @Tmp = map {[split /\./]} @Arr;</div><div class="code_line">&nbsp;</div><div class="code_line"># обработка</div><div class="code_line">&nbsp;</div><div class="code_line">ExpandSubsections(\@Tmp, \@Res);</div><div class="code_line">&nbsp;</div><div class="code_line"># печать результата</div><div class="code_line">&nbsp;</div><div class="code_line">map {say join(&#39;.&#39;, @{$_})} @Res;</div><div class="code_line">&nbsp;</div><div class="code_line"># ------------------------------------------</div><div class="code_line">&nbsp;</div><div class="code_line">sub ExpandSubsections {</div><div class="code_line">&nbsp;&nbsp;my ($Tmp, $Res) = @_;</div><div class="code_line">&nbsp;&nbsp;my %Seen;</div><div class="code_line">&nbsp;&nbsp;foreach my $i (@{$Tmp}) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;do {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;my @Items = @{$i};</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;my $Key = join(&quot;.&quot;, @Items);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;unless (exists $Seen{$Key}) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$Seen{$Key} = &quot;*&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;push @{$Res}, [@Items];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;pop @{$i};</div><div class="code_line">&nbsp;&nbsp; &nbsp;} while (scalar(@{$i}));</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;@{$Res} = sort {</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 1 &nbsp;if (@$b &#62; @$a);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return -1 if (@$b &#60; @$a);</div><div class="code_line">&nbsp;&nbsp; &nbsp;for my $i (0 .. @$a - 1) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return -1 if ($a-&#62;[$i] &#60; $b-&#62;[$i]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return 1 &nbsp;if ($a-&#62;[$i] &#62; $b-&#62;[$i]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">&nbsp;&nbsp;} @{$Res};</div><div class="code_line">}</div></ol></div></div></div></div><br>
<strong class='tag-b'>C++</strong><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;algorithm&#62;</div><div class="code_line">#include &#60;vector&#62;</div><div class="code_line">#include &#60;sstream&#62;</div><div class="code_line">#include &#60;iterator&#62;</div><div class="code_line">#include &#60;unordered_map&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">void ExpandSubsections(std::vector&#60;std::vector&#60;unsigned&#62;&#62;&amp; tmp, std::vector&#60;std::vector&#60;unsigned&#62;&#62;&amp; res) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::unordered_map&#60;std::string, bool&#62; seen;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const auto&amp; i : tmp) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::vector&#60;unsigned&#62; items = i;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;do {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::stringstream key;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::copy(items.begin(), items.end(), std::ostream_iterator&#60;unsigned&#62;(key, &quot;.&quot;));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::string val = key.str();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (seen.find(val) == seen.end()) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;res.push_back(items);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;seen[val] = true;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;items.pop_back();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} while (!items.empty());</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::sort(res.begin(), res.end(), [](const std::vector&#60;unsigned&#62;&amp; a, const std::vector&#60;unsigned&#62;&amp; b) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (a.size() != b.size())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return a.size() &#62; b.size();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (size_t i = 0; i &#60; a.size(); ++i) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (a[i] != b[i])</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return a[i] &#60; b[i];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;&nbsp; &nbsp;});</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::vector&#60;std::string&#62; arr = {&quot;1.12&quot;, &quot;2.4.15&quot;, &quot;111.1.1&quot;, &quot;3.4&quot;, &quot;1.1&quot;};</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::vector&#60;std::vector&#60;unsigned&#62;&#62; res;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// если задан массив в &quot;точечной нотации&quot; преобразуем в массив массивов</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::vector&#60;std::vector&#60;unsigned&#62;&#62; tmp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const auto&amp; str : arr) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::vector&#60;unsigned&#62; subsection;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::stringstream ss(str);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::string el;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;while (std::getline(ss, el, &#39;.&#39;)) subsection.push_back(std::stoul(el));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;tmp.push_back(subsection);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// обработка</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ExpandSubsections(tmp, res);</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// печать результата</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const auto&amp; subsection : res) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (size_t i = 0; i &#60; subsection.size(); ++i) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; subsection[i];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (i != subsection.size() - 1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; &quot;.&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
Оба вывода идентичны, и так как мне надо  ;) <br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">2.4.15 </div><div class="code_line">111.1.1</div><div class="code_line">1.1 &nbsp; &nbsp;</div><div class="code_line">1.12 &nbsp; </div><div class="code_line">2.4 &nbsp; &nbsp;</div><div class="code_line">3.4 &nbsp; &nbsp;</div><div class="code_line">111.1 &nbsp;</div><div class="code_line">1 &nbsp; &nbsp; &nbsp;</div><div class="code_line">2 &nbsp; &nbsp; &nbsp;</div><div class="code_line">3 &nbsp; &nbsp; &nbsp;</div><div class="code_line">111</div></ol></div></div></div></div><br>
Perl красивше&#33;  :lol:]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899259</guid>
        <pubDate>Wed, 24 Jan 2024 13:43:47 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899259</link>
        <description><![CDATA[Majestio: Выписался с больнички с диагнозом &quot;небольшой диабетик II&quot; (неинсулиновый) :( <br>
<br>
А по существу вопроса, <strong class='tag-b'>shm</strong>, твой код немного косячит на следующем сетапе:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">const std::vector&#60;std::string&#62; arr = {&quot;1.12.1&quot;, &quot;2.4.15&quot;, &quot;1.11.1&quot;, &quot;33.4&quot;};</div></ol></div></div></div></div><br>
Выдает:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">1.11.1</div><div class="code_line">1.12.1</div><div class="code_line">2.4.15</div><div class="code_line">1.11</div><div class="code_line">1.12</div><div class="code_line">2.4</div><div class="code_line">33.4</div><div class="code_line">1</div><div class="code_line">1</div><div class="code_line">2</div><div class="code_line">33</div></ol></div></div></div></div><br>
Дубль цифры &quot;1&quot;. Ну а так, да - норм.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899103</guid>
        <pubDate>Sat, 20 Jan 2024 17:35:37 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899103</link>
        <description><![CDATA[Majestio: Я залетел в больничку, чисто на телефоне некузяво смотреть код. Вернусь - заценю.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899102</guid>
        <pubDate>Sat, 20 Jan 2024 17:07:53 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899102</link>
        <description><![CDATA[shm: Описание не осилил, но если подгонять под пример и использовать одни векторы, то как-то так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;vector&#62;</div><div class="code_line">#include &#60;algorithm&#62;</div><div class="code_line">#include &#60;string&#62;</div><div class="code_line">#include &#60;unordered_set&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">int main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;const std::vector&#60;std::string&#62; arr = {&quot;1.1&quot;, &quot;2.4.5&quot;, &quot;1.1.1&quot;, &quot;3.4&quot;};</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::vector&#60;std::vector&#60;int&#62;&#62; int_arr;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::vector&#60;std::vector&#60;int&#62;&#62; int_out_arr;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::vector&#60;std::string&#62; out_arr;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const std::string&amp; s : arr)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::vector&#60;int&#62; x;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;size_t i = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for ( ; ; )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const size_t j = s.find(&#39;.&#39;, i);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;x.emplace_back(std::stoi(s.substr(i, j != std::string::npos ? (j - i) : j)));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (j == std::string::npos)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i = j + 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int_arr.emplace_back(std::move(x));</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::sort(int_arr.begin(), int_arr.end());</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (size_t i = 0; i &#60; int_arr.size(); ++i)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;size_t len = int_arr[i].size();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (i != 0 &amp;&amp; std::equal(int_arr[i - 1].begin(), int_arr[i - 1].end(), int_arr[i].begin()))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;len -= int_arr[i - 1].size();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;while (len-- &#62; 1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int_out_arr.emplace_back(std::vector&#60;int&#62;(int_arr[i].begin(), int_arr[i].begin() + len));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int_out_arr.emplace_back(int_arr[i]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::sort(int_out_arr.begin(), int_out_arr.end(), [](const std::vector&#60;int&#62;&amp;a, const std::vector&#60;int&#62;&amp;b){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (a.size() == b.size())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return a &#60; b;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return a.size() &#62; b.size();</div><div class="code_line">&nbsp;&nbsp; &nbsp;});</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const std::vector&#60;int&#62;&amp; line : int_out_arr)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::string s;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (int value : line)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!s.empty())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;s += &#39;.&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;s += std::to_string(value);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;out_arr.emplace_back(std::move(s));</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const std::string&amp; s : out_arr)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; s &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899083</guid>
        <pubDate>Fri, 19 Jan 2024 13:58:22 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899083</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441411&view=findpost&p=3899080'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-01-19T12:28:07+00:00">19.01.24, 12:28</time></span><div class='quote '>Сортировка по длинам строк опасна, для двузначных номеров (под)разделов будет сбоить.<br>
</div></div><br>
Я тебя понял. У меня таких нет - но предусмотреть нужно&#33;]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899080</guid>
        <pubDate>Fri, 19 Jan 2024 12:28:07 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899080</link>
        <description><![CDATA[Qraizer: Сортировка по длинам строк опасна, для двузначных номеров (под)разделов будет сбоить.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899078</guid>
        <pubDate>Fri, 19 Jan 2024 10:42:16 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899078</link>
        <description><![CDATA[Majestio: В общем, чтобы вопрос закрыть, опубликую свои реализации только для точечной нотации рубрикатора.<br>
<br>
<strong class='tag-b'>Сперва на Perl 5</strong>  :rolleyes: (<a class='tag-url' href='https://ideone.com/M9UEve' target='_blank'>https://ideone.com/M9UEve</a>)<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#!/usr/bin/perl</div><div class="code_line">&nbsp;</div><div class="code_line">use strict;</div><div class="code_line">use warnings;</div><div class="code_line">use v5.24;</div><div class="code_line">&nbsp;</div><div class="code_line">my @Arr = (&#39;1.1&#39;, &#39;2.4.5&#39;, &#39;1.1.1&#39;, &#39;3.4&#39;);</div><div class="code_line">my %Tmp = ();</div><div class="code_line">&nbsp;</div><div class="code_line">foreach my $i (@Arr) {</div><div class="code_line">&nbsp;&nbsp;$Tmp{$i} = &#39;*&#39;;</div><div class="code_line">&nbsp;&nbsp;my $j = $i;</div><div class="code_line">&nbsp;&nbsp;while ($j =~ /^(.+).\d/) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;$j = ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;$Tmp{$j} = &#39;*&#39;;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">my @Res = sort {return (length($a) == length($b)) ? $a cmp $b : length($b) &#60;=&#62; length($a)} keys %Tmp;</div><div class="code_line">map {say $_ } @Res;</div></ol></div></div></div></div><br>
<strong class='tag-b'>Потом это же на C++</strong> (<a class='tag-url' href='https://ideone.com/96ifZV' target='_blank'>https://ideone.com/96ifZV</a>)<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;vector&#62;</div><div class="code_line">#include &#60;map&#62;</div><div class="code_line">#include &#60;regex&#62;</div><div class="code_line">#include &#60;algorithm&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::vector&#60;std::string&#62; Arr = {&quot;1.1&quot;, &quot;2.4.5&quot;, &quot;1.1.1&quot;, &quot;3.4&quot;};</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::map&#60;std::string, std::string&#62; Tmp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::regex re(R&quot;((.+?)\.\d)&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::smatch match;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const auto&amp; i : Arr) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Tmp[i] = &quot;*&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::string j = i;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;while (std::regex_search(j, match, re)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;j = match.str(1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Tmp[j] = &quot;*&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::vector&#60;std::string&#62; Res;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const auto&amp; pair : Tmp) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Res.push_back(pair.first);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::sort(Res.begin(), Res.end(), [](const std::string&amp; a, const std::string&amp; b) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return (a.length() == b.length()) ? a &#60; b : a.length() &#62; b.length();</div><div class="code_line">&nbsp;&nbsp; &nbsp;});</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const auto&amp; item : Res) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; item &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<strong class='tag-b'>Вывод будет одинаков:</strong><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">1.1.1</div><div class="code_line">2.4.5</div><div class="code_line">1.1</div><div class="code_line">2.4</div><div class="code_line">3.4</div><div class="code_line">1</div><div class="code_line">2</div><div class="code_line">3</div></ol></div></div></div></div><br>
Собственно , что и требовалось. За сим вопрос считаю для себя закрытым. Но если кому будет интересно реализовать компактнее - вэлком. Равно как и реализовать алгоритм чисто на векторах, без точечной нотации.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899057</guid>
        <pubDate>Fri, 19 Jan 2024 07:37:34 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899057</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441411&view=findpost&p=3899053'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>MBo &#064; <time class="tag-quote__quoted-time" datetime="2024-01-19T07:06:04+00:00">19.01.24, 07:06</time></span><div class='quote '>Впрочем, может, это и лишнее. Все префиксы всё равно генерировать надо - так сгенерировать их, сложить в одно место, и отсортировать с тем же компаратором.</div></div><br>
Именно. Я, пока ехал домой, тоже об этом подумал. Сначала разворачиваем все префиксы и складываем в кучу. Потом удаляем дубли. Потом сортируем. Да, так будет проще.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899053</guid>
        <pubDate>Fri, 19 Jan 2024 07:06:04 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899053</link>
        <description><![CDATA[MBo: Впрочем, может, это и лишнее. Все префиксы всё равно генерировать надо - так сгенерировать их, сложить в одно место, и отсортировать с тем же компаратором.]]></description>
        <author>MBo</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899050</guid>
        <pubDate>Fri, 19 Jan 2024 04:48:31 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899050</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441411&view=findpost&p=3899049'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>MBo &#064; <time class="tag-quote__quoted-time" datetime="2024-01-19T04:43:53+00:00">19.01.24, 04:43</time></span><div class='quote '>Тогда можно создать std::priority_queue</div></div><br>
Пасип&#33; Никогда это не приходилось использовать - буду почитать :)]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899049</guid>
        <pubDate>Fri, 19 Jan 2024 04:43:53 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899049</link>
        <description><![CDATA[MBo: ОК, значит, я верно понял.<br><br>Тогда можно создать  std::priority_queue, содержащую vector&lt;int&gt;, и написать для очереди функцию сравнения, в которой первичный ключ - длина вектора, а вторичный при равенстве - набор значений.<br><br>Закладываем все полные вектора в очередь. <br>На каждом шаге извлекаем вектор с верхушки очереди, на вывод его, удаляем последний элемент вектора, и если он не пуст - кладём обратно в кучу.]]></description>
        <author>MBo</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899048</guid>
        <pubDate>Fri, 19 Jan 2024 04:29:13 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899048</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441411&view=findpost&p=3899047'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>MBo &#064; <time class="tag-quote__quoted-time" datetime="2024-01-19T03:48:50+00:00">19.01.24, 03:48</time></span><div class='quote '>но лучше всё-таки объяснить, что имелось в виду</div></div><br>
Хорошо, сделаю вам многобукв  :rolleyes: ...<br>
Имеется некий многоуровневый рубрикатор. <br>
<br>
Пример:<br>
<br>
1 Топчик <br>
1.1 Ниже<br>
1.1.1 Еще ниже<br>
...<br>
3.2 Что-то там<br>
...<br>
3.4 Что-то там еще<br>
<br>
Есть плоская таблица связи элементов с этим рубрикатором. <br>
<br>
Простой вариант - в таблице найдена одна связь 1.1.1. Значит нам нужно из нее (из связи) получить дополнительные связи 1.1 и 1. При этом будем считать самую &quot;глубокую&quot; связь 1.1.1 главной, остальные полученные - дополнительными. Что делать, если изначально имеем привязку не к одному элементу рубрикатора, а к нескольким? Тут придется привязывать как и в первом случае, но находить главную связь уже по своим правилам. А они будут такие:<br>
<br>
1) Все низ лежащие рубрики разворачиваем и дополняем в вектор<br>
2) Если появляются дубли - оставляем только один из элементов<br>
3) Производим сортировку по правилам - сперва по &quot;длине&quot; в порядке убывания, среди рубрик равной &quot;длины&quot; в порядке возрастания.<br>
<br>
Первую рубрику в полученном векторе считаем - главной. Остальные ... ну неглавными  :lol: <br>
<br>
Ну вот как-то так. <br>
<br>
И да ... в самом начале вектор привязок от дублей изначально очищен. А в рубрикаторе в каждой ветке может быть своя глубина. А в таблице связей с рубрикатором могут быть связи только к самым низ лежащим рубрикам. В примере этого поста - связи к 1.1 или 1 быть не может, только 1.1.1.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899047</guid>
        <pubDate>Fri, 19 Jan 2024 03:48:50 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899047</link>
        <description><![CDATA[MBo: Лучше всё-таки помучиться © тов. Сухов<br><br>Можно предположить, что выдаются сортированные префиксы подмассивов, при этом длина - первый ключ сортировки по убыванию, но лучше всё-таки объяснить, что имелось в виду.]]></description>
        <author>MBo</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899044</guid>
        <pubDate>Thu, 18 Jan 2024 23:15:00 +0000</pubDate>
        <title>Преобразование массива</title>
        <link>https://forum.sources.ru/index.php?showtopic=441411&amp;view=findpost&amp;p=3899044</link>
        <description><![CDATA[Majestio: Всем привет&#33;<br>
<br>
Пришла моя очередь просить помощи  :) Нужен компактный алгоритм на C++20 не выше, с максимальным задействованием стандартной библиотеки.<br>
Пока просто приведу пример, что есть и что должно получиться:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;vector&#62;</div><div class="code_line">#include &#60;string&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">using Vint = std::vector&#60;int&#62;;</div><div class="code_line">using Bolt = std::vector&#60;Vint&#62;;</div><div class="code_line">using Wood = std::vector&#60;std::string&#62;;</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;Bolt raw = { {4,6}, {5,2}, {4,7,1}, {3,2,1}, {2,2} };</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// тут ваше супер-преобразование-1 и нужный результат</div><div class="code_line">&nbsp;&nbsp;// Bolt wet = { {3,2,1}, {4,7,1}, {2,2}, {3,2}, {4,6}, {4,7}, {5,2}, {2}, {3}, {4}, {5} };</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;Wood dirty = { &quot;4.6&quot;, &quot;5.2&quot;, &quot;4.7.1&quot;, &quot;3.2.1&quot;, &quot;2.2&quot; };</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;// тут ваше супер-преобразование-2 и нужный результат</div><div class="code_line">&nbsp;&nbsp;// Wood pure = { &quot;3.2.1&quot;, &quot;4.7.1&quot;, &quot;2.2&quot;, &quot;3.2&quot;, &quot;4.6&quot;, &quot;4.7&quot;, &quot;5.2&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;, &quot;5&quot; };</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Если логика преобразований не совсем очевидна - дайте занть, я распишу.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	