<?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=410042&amp;view=findpost&amp;p=3697736</guid>
        <pubDate>Wed, 14 Dec 2016 09:07:37 +0000</pubDate>
        <title>поиск в unordered_map</title>
        <link>https://forum.sources.ru/index.php?showtopic=410042&amp;view=findpost&amp;p=3697736</link>
        <description><![CDATA[XandoX: <strong class='tag-b'>JoeUser</strong> Спасибо. Действительно выглядит пока что единственным вариантом, но кривоватым.]]></description>
        <author>XandoX</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410042&amp;view=findpost&amp;p=3697612</guid>
        <pubDate>Tue, 13 Dec 2016 15:40:12 +0000</pubDate>
        <title>поиск в unordered_map</title>
        <link>https://forum.sources.ru/index.php?showtopic=410042&amp;view=findpost&amp;p=3697612</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410042&view=findpost&p=3697466'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>XandoX &#064; <time class="tag-quote__quoted-time" datetime="2016-12-12T17:28:49+00:00">12.12.16, 17:28</time></span><div class='quote '>В общем-то вопрос в том, можно ли как-то обойтись без выделения памяти под новую std::string в стоке //overhead</div></div><br>
1) Заранее создать временную строку, и reserve ее в &quot;максимальный размер из всех больших строк&quot;. Если максимальный размер не может быть заранее рассчитан выделить побольше, пусть 64к, и на каждой итерации сравнивать, и если надо перевыделять больше. Но лучче рассчитать всеж заранее.<br>
2) Во временную строку делать assign<br>
<br>
<strong class='tag-b'><a class='tag-url' href='http://ideone.com/IDgvLY' target='_blank'>Ну вот как-то так</a></strong>, но я итерации по &quot;большим строкам&quot; не делал:<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;unordered_map&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">typedef std::pair&#60;std::string::const_iterator,std::string::const_iterator&#62; FindType;</div><div class="code_line">&nbsp;</div><div class="code_line">FindType findSubKey(std::string &amp;S) {</div><div class="code_line">&nbsp;&nbsp;auto a = S.find_first_of(&#39;a&#39;); &nbsp; </div><div class="code_line">&nbsp;&nbsp;auto b = S.find_last_of(&#39;f&#39;);</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; a &#60;&#60; &quot;:&quot; &#60;&#60; b &#60;&#60;std::endl; &nbsp;</div><div class="code_line">&nbsp;&nbsp;return {S.begin()+a,S.begin()+b}; &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::unordered_map&#60;std::string, int&#62; map = {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{&quot;123&quot;,3},</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{&quot;123456abcdefx&quot;,2},</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{&quot;abcde&quot;,7}, &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{&quot;6abcdef&quot;,1}</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string bigString = &quot;123abcdefjhk&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string::const_iterator subKeyBegin, subKeyEnd;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::tie(subKeyBegin, subKeyEnd) = findSubKey(bigString);</div><div class="code_line">&nbsp;&nbsp; &nbsp;//////////////////////////////////////////////////////////////////</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string Tmp = &quot;&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Tmp.reserve(bigString.size());</div><div class="code_line">&nbsp;&nbsp; &nbsp;//////////////////////////////////////////////////////////////////</div><div class="code_line">&nbsp;&nbsp; &nbsp;Tmp.assign(subKeyBegin,subKeyEnd);</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;\&quot;&quot; &#60;&#60; Tmp &#60;&#60; &quot;\&quot;&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; (map.find(Tmp)!=map.end() ? &quot;Нашли&quot;:&quot;Не нашли&quot;) &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
По идее будет только копирование в Tmp, дергаться память не должна.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410042&amp;view=findpost&amp;p=3697568</guid>
        <pubDate>Tue, 13 Dec 2016 11:13:59 +0000</pubDate>
        <title>поиск в unordered_map</title>
        <link>https://forum.sources.ru/index.php?showtopic=410042&amp;view=findpost&amp;p=3697568</link>
        <description><![CDATA[shm: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410042&view=findpost&p=3697549'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>XandoX &#064; <time class="tag-quote__quoted-time" datetime="2016-12-13T09:02:06+00:00">13.12.16, 09:02</time></span><div class='quote '>а вот других вариантов я пока не особо вижу. </div></div><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">struct my_string</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; std::string str;</div><div class="code_line">&nbsp;&nbsp; std::string::const_iterator begin;</div><div class="code_line">&nbsp;&nbsp; std::string::const_iterator end;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410042&view=findpost&p=3697549'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>XandoX &#064; <time class="tag-quote__quoted-time" datetime="2016-12-13T09:02:06+00:00">13.12.16, 09:02</time></span><div class='quote '>Да причем тут компаратор или хэш-функция.</div></div><br>
Их нужно переопределять для своего типа.]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410042&amp;view=findpost&amp;p=3697549</guid>
        <pubDate>Tue, 13 Dec 2016 09:02:06 +0000</pubDate>
        <title>поиск в unordered_map</title>
        <link>https://forum.sources.ru/index.php?showtopic=410042&amp;view=findpost&amp;p=3697549</link>
        <description><![CDATA[XandoX: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410042&view=findpost&p=3697472'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>shm &#064; <time class="tag-quote__quoted-time" datetime="2016-12-12T18:09:08+00:00">12.12.16, 18:09</time></span><div class='quote '>Если у тебя не магабайтные строки, то не должно особо влиять.</div></div><br>
Ну некоторые системные аллокторы настолько тупые, что влияет сам факт аллоцирования, а вот размер не сильно важен.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410042&view=findpost&p=3697472'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>shm &#064; <time class="tag-quote__quoted-time" datetime="2016-12-12T18:09:08+00:00">12.12.16, 18:09</time></span><div class='quote '>Точнее у него не компаратор, а хэш-функция.</div></div><br>
Да причем тут компаратор или хэш-функция. Меня и стандартные вполне устраивают. <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410042&view=findpost&p=3697472'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>shm &#064; <time class="tag-quote__quoted-time" datetime="2016-12-12T18:09:08+00:00">12.12.16, 18:09</time></span><div class='quote '>А так принципиально, чтобы внутри unordered_map был только std::string? <br>
</div></div><br>
Вот это главный вопрос. Вообще не принципиально, но писать свой string_view, очень лень, а вот других вариантов я пока не особо вижу.]]></description>
        <author>XandoX</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410042&amp;view=findpost&amp;p=3697472</guid>
        <pubDate>Mon, 12 Dec 2016 18:09:08 +0000</pubDate>
        <title>поиск в unordered_map</title>
        <link>https://forum.sources.ru/index.php?showtopic=410042&amp;view=findpost&amp;p=3697472</link>
        <description><![CDATA[shm: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410042&view=findpost&p=3697471'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>XandoX &#064; <time class="tag-quote__quoted-time" datetime="2016-12-12T18:00:04+00:00">12.12.16, 18:00</time></span><div class='quote '>1000 раз в секунду </div></div><br>
Если у тебя не магабайтные строки, то не должно особо влиять.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410042&view=findpost&p=3697471'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>XandoX &#064; <time class="tag-quote__quoted-time" datetime="2016-12-12T18:00:04+00:00">12.12.16, 18:00</time></span><div class='quote '>то find принимает только std::string, в данном случаи? </div></div><br>
А так принципиально, чтобы внутри unordered_map был только std::string? <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="2016-12-12T18:11:04+00:00">12.12.16, 18:11</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410042&view=findpost&p=3697470'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>shm &#064; <time class="tag-quote__quoted-time" datetime="2016-12-12T17:55:27+00:00">12.12.16, 17:55</time></span><div class='quote '>Как вариант можно запилить свой компаратор в unordered_map. </div></div><br>
Точнее у него не компаратор, а хэш-функция.]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410042&amp;view=findpost&amp;p=3697471</guid>
        <pubDate>Mon, 12 Dec 2016 18:00:04 +0000</pubDate>
        <title>поиск в unordered_map</title>
        <link>https://forum.sources.ru/index.php?showtopic=410042&amp;view=findpost&amp;p=3697471</link>
        <description><![CDATA[XandoX: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>а что, это создание подстроки так влияет на скорость?</div></div><br>
<br>
Ну в конкретном примере, конечно же не сильно важно, но вот если 1000 раз в секунду пытаться это сделать, то - да, да и дефрагментация памяти.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Как вариант можно запилить свой компаратор в unordered_map.</div></div><br>
И как обойти проблему - что find принимает только std::string, в данном случаи?]]></description>
        <author>XandoX</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410042&amp;view=findpost&amp;p=3697470</guid>
        <pubDate>Mon, 12 Dec 2016 17:55:27 +0000</pubDate>
        <title>поиск в unordered_map</title>
        <link>https://forum.sources.ru/index.php?showtopic=410042&amp;view=findpost&amp;p=3697470</link>
        <description><![CDATA[shm: <strong class='tag-b'>XandoX</strong>,а что, это создание подстроки так влияет на скорость? Как вариант можно запилить свой компаратор в unordered_map.]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410042&amp;view=findpost&amp;p=3697466</guid>
        <pubDate>Mon, 12 Dec 2016 17:28:49 +0000</pubDate>
        <title>поиск в unordered_map</title>
        <link>https://forum.sources.ru/index.php?showtopic=410042&amp;view=findpost&amp;p=3697466</link>
        <description><![CDATA[XandoX: Привет<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">std::unordered_map&#60;std::string, something_t&#62; map;</div><div class="code_line">std::string bigString;</div><div class="code_line">std::string::const_iterator subKeyBegin, subKeyEnd;</div><div class="code_line">std::tie(subKeyBegin, subKeyEnd) = findSubKey(bigString);</div><div class="code_line">&nbsp;</div><div class="code_line">if (map.find(std::string(subKeyBegin, subKeyEnd)) != map.end()) // overhead</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; doThen();</div><div class="code_line">}</div><div class="code_line">else</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; doElse();</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
В общем-то вопрос в том, можно ли как-то обойтись без выделения памяти под новую std::string в стоке //overhead<br>
Проблема в том, что unordered_map, да и просто map в find принимают только Key и нельзя туда передать что-то что на этот Key похоже и с ним умеет как-то сравниваться. А std::string, зараза, всегда аллоцирует. <br>
Большой надежды нет, но может я еще чего-то недоглядел?<br>
<br>
Еще как вариант можно string для ключа один раз создать, а потом его assign каждый раз, что бы туда-сюда не выделять/освобождать память, но это как-то половинчато. <br>
<br>
Компиляторы - все, максимальный стандарт - 14.]]></description>
        <author>XandoX</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	