<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>algorithm on yonmy</title><link>https://yonmy.com/tags/algorithm/</link><description>Recent content in algorithm on yonmy</description><generator>Hugo</generator><language>ko-KR</language><lastBuildDate>Thu, 05 May 2016 00:59:14 +0900</lastBuildDate><atom:link href="https://yonmy.com/tags/algorithm/index.xml" rel="self" type="application/rss+xml"/><item><title>swap을 사용하면 최적화 할 수 있다.</title><link>https://yonmy.com/archives/23/</link><pubDate>Thu, 05 May 2016 00:59:14 +0900</pubDate><guid>https://yonmy.com/archives/23/</guid><description>&lt;p&gt;Lock을 잡는 scope는 최소화 해야 하는 것은 잘 알고 있을 것이다.&lt;/p&gt;&#10;&lt;p&gt;swap을 활용하면 더 좋다는 것에 대해서 이야기 해보려고 한다.&lt;/p&gt;&#10;&lt;p&gt;개발을 하다보면 map을 만들어 놓고 객체를 등록하고, 찾고, 제거하는 일을 많이 하게 된다.&lt;/p&gt;&#10;&lt;p&gt;예를 들어 다음과 같은 Manager class를 만들어 사용한다고 하자&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Manager&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;unique_ptr&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_cont&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;Register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;unique_ptr&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;ptr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_cont&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;Remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_cont&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;erase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt; &lt;/p&gt;&#10;&lt;p&gt;만약 Manager가 멀티쓰레드 환경에서 thread safe해져야 한다면,&lt;/p&gt;&#10;&lt;p&gt;lock free container를 도입하거나,&lt;/p&gt;</description></item><item><title>std::map(set) insert 정확하게 사용하기</title><link>https://yonmy.com/archives/9/</link><pubDate>Sun, 17 Apr 2016 11:53:21 +0900</pubDate><guid>https://yonmy.com/archives/9/</guid><description>&lt;p&gt;꽤나 많은 프로그래머들이 std::map insert 의 사용을 잘 못 하고 있는 경우가 있어서, 오늘은 그것에 대해 이야기 하려고 한다.&lt;/p&gt;&#10;&lt;p&gt;우선 std::map의 insert의 기본형을 보면 다음과 같다.&lt;/p&gt;&#10;&lt;p&gt;pair&amp;lt;iterator,bool&amp;gt; insert (const pair&amp;lt;const Key, Type&amp;gt;&amp;amp; val);&lt;/p&gt;&#10;&lt;p&gt;여기서 중요한점은 리턴값으로 pair를 돌려주고 있는데, 이 리턴값의 의미를 정확히 이해 하고 있어야 한다.&lt;/p&gt;&#10;&lt;div class="table-responsive"&gt;&lt;table style="width:700px; " class="easy-table easy-table-cuscosky " &gt;&#10;&lt;thead&gt;&#10;&lt;tr&gt;&lt;th &gt;insert 결과&lt;/th&gt;&#10;&lt;th &gt; 첫번째(iterator)&lt;/th&gt;&#10;&lt;th &gt; 두번째(bool)&lt;/th&gt;&#10;&lt;th &gt; 언제 발생&lt;/th&gt;&#10;&lt;/tr&gt;&#10;&lt;/thead&gt;&#10;&lt;tbody&gt;&#10;&lt;tr&gt;&lt;td &gt;성공&lt;/td&gt;&#10;&lt;td &gt; insert되어진 element의 iterator&lt;/td&gt;&#10;&lt;td &gt; true&lt;/td&gt;&#10;&lt;td &gt; 중복된 Key가 존재 하지 않을때&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&lt;td &gt;실패&lt;/td&gt;&#10;&lt;td &gt; 중복된 Key의 element의 iterator&lt;/td&gt;&#10;&lt;td &gt; false&lt;/td&gt;&#10;&lt;td &gt; 중복된 Key가 존재 할때&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#10;&lt;p&gt;insert를 한다는 것도 내부적으로 insert할 위치를 찾아가며, (이는 &lt;a href="https://en.wikipedia.org/wiki/Red%E2%80%93black_tree"&gt;Red-black tree&lt;/a&gt; 를 구성 하려면 당연하다.)&lt;/p&gt;</description></item></channel></rss>