<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
     >
  <channel>
    <title>arturo castro</title>
    <link>http://arturocastro.net/blog</link>
    <description></description>
    <pubDate>Fri, 04 Jan 2013 16:11:45 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>stl::vector</title>
      <link>http://arturocastro.net/blog/2011/10/28/stl::vector</link>
      <pubDate>Fri, 28 Oct 2011 21:10:00 CEST</pubDate>
      <category><![CDATA[c++ DataStructures Tutorials]]></category>
      <guid isPermaLink="true">http://arturocastro.net/blog/2011/10/28/stl::vector</guid>
      <description>stl::vector</description>
      <content:encoded><![CDATA[<p>A stl::vector is the equivalent in c++ to a c array. Everything that can be done with a vector can be done with a c array and viceversa<a href="#1">[1]</a> the only difference between them is that the vector interface is object oriented, which means that your code will be cleaner and easier to understand. I'm going to explain here some aspects of it's inner workings trying to make it clearer how to use a vector in a safe and fast way.</p>
<p>--more--</p>
<h3>reserve() and capacity() vs resize() and size()</h3>
<p>reserve() makes the vector allocate memory internally but that doesn't mean that that memory is being used yet. We can know how much memory a vector has allocated by calling capacity().</p>
<p>resize() allocates memory if it's necesary and it also marks it as used. We can know how much elements are in use by calling size():</p>
<div class="pygments_murphy"><pre><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">;</span>
<span class="n">v</span><span class="p">.</span><span class="n">reserve</span><span class="p">(</span><span class="mi">50</span><span class="p">);</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>    <span class="c1">// will print 50</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>        <span class="c1">// will print 0</span>

<span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>    <span class="c1">// will print 50</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>        <span class="c1">// will print 1</span>

<span class="n">v</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="mi">100</span><span class="p">);</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>    <span class="c1">// will print 100</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>        <span class="c1">// will print 100</span>
</pre></div>

<p>clear() is also related to the number of used elements, not to the allocated memory. So if we call clear we are actually telling that no memory is in use but there's actually no memory deletion: <strong>vectors' allocated memory never shrinks</strong><a href="#2">[2]</a>:</p>
<div class="pygments_murphy"><pre><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">;</span>
<span class="n">v</span><span class="p">.</span><span class="n">reserve</span><span class="p">(</span><span class="mi">50</span><span class="p">);</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>    <span class="c1">// will print 50</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>        <span class="c1">// will print 0</span>

<span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>    <span class="c1">// will print 50</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>        <span class="c1">// will print 1</span>

<span class="n">v</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>    <span class="c1">// will print 50</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>        <span class="c1">// will print 0</span>
</pre></div>

<p>So calling clear is actually fast and reusing a vector is faster than creating a new one cause the memory is already allocated.</p>
<h3>push_back()</h3>
<p>The push_back method of a vector inserts a new element at the end, but, what happens with memory internally? Well, even if the size of the vector increases by one <strong>vectors' capacity grows exponentially</strong><a href="#2">[2]</a>:</p>
<div class="pygments_murphy"><pre><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">;</span>
<span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>  <span class="c1">// will print 1</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>      <span class="c1">// will print 1</span>

<span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>  <span class="c1">// will print 2</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>      <span class="c1">// will print 2</span>

<span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>  <span class="c1">// will print 4 &lt;&lt;&lt;</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>      <span class="c1">// will print 3</span>

<span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>  <span class="c1">// will print 4</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>      <span class="c1">// will print 4</span>

<span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>  <span class="c1">// will print 8 &lt;&lt;&lt;</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>      <span class="c1">// will print 5</span>
</pre></div>

<p>A vector behaves like this to make things faster, and it makes things faster for 2 reasons:</p>
<ul>
<li><strong>Allocating memory is slow</strong> but it's equally slow no matter how much memory we are allocating<a href="#3">[3]</a></li>
<li><strong>All the elements in a vector are contiguous in memory</strong>. When we push back a new element it has to be after the last one. So if there's no more unallocated memory after the last element, the vector needs to move all the elements that it already contained to a new position. Moving all the elements actually means: allocating new memory, copying all the elements to the new location and deleting the old memory, which is really, really slow</li>
</ul>
<p>As it can be seen in the previous code, whenever there's no more space left in the vector, and we add a new element, it doubles the size of the allocated memory, that way we can keep adding elements for a while without reallocations.</p>
<p>Now if we print the address in memory of the first element after pushing back new ones, we'll see that probably<a href="#4">[4]</a>, after exhausting the capacity, the vector moves it's elements to a new location in memory:</p>
<div class="pygments_murphy"><pre><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">;</span>
<span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>  <span class="c1">//will print out 1</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">&amp;</span><span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span>          <span class="c1">//will print some address</span>

<span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>  <span class="c1">//will print out 2</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">&amp;</span><span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span>          <span class="c1">//will probably print a different address</span>

<span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>  <span class="c1">//will print out 4 &lt;&lt;&lt;</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">&amp;</span><span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span>          <span class="c1">//will probably print a different address</span>

<span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>  <span class="c1">//will print out 4</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">&amp;</span><span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span>          <span class="c1">//will print the same address</span>

<span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>  <span class="c1">//will print out 8 &lt;&lt;&lt;</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">&amp;</span><span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span>          <span class="c1">//will probably print a different address</span>
</pre></div>

<p>This is very important for several resons: as i've told before the exponential growth makes thing faster, but even with that, allocating new memory and moving the elements around is slow. So if you know you are going to have at least 50 elements it's better to reserve that memory or more before beginning to add elements:</p>
<div class="pygments_murphy"><pre><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">;</span>
<span class="n">v</span><span class="p">.</span><span class="n">reserve</span><span class="p">(</span><span class="mi">50</span><span class="p">);</span>
<span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="c1">//...</span>
</pre></div>

<p>That way there's going to be no memory reallocation till we push back 50 elements.</p>
<h3>push_back() is slow</h3>
<p>Try to avoid it if you are going to add lots of elements. For the reasons mentioned above this:</p>
<div class="pygments_murphy"><pre><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">;</span>

<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">i</span><span class="o">&lt;</span><span class="mi">100</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
    <span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>

<p>is way slower than:</p>
<div class="pygments_murphy"><pre><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">;</span>

<span class="n">v</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="mi">100</span><span class="p">);</span>
<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">i</span><span class="o">&lt;</span><span class="mi">100</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
    <span class="n">v</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>

<p>Use the second!</p>
<p>Even this:</p>
<div class="pygments_murphy"><pre><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">;</span>
<span class="n">v</span><span class="p">.</span><span class="n">reserve</span><span class="p">(</span><span class="mi">100</span><span class="p">);</span>

<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">i</span><span class="o">&lt;</span><span class="mi">100</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
    <span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>

<p>is slightly slower since push_back has to check if there's still memory available while when using the [] operator there's no check.</p>
<p>If you are adding a few elements at a time or one by one and don't know how many you'll have then push_back is the best because of the exponential growth. For example:</p>
<div class="pygments_murphy"><pre><span class="k">class</span> <span class="nc">Shape</span><span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
<span class="kt">void</span> <span class="n">addVertex</span><span class="p">(</span><span class="n">Point</span> <span class="n">p</span><span class="p">){</span>
    <span class="n">points</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">p</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">private</span><span class="o">:</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="n">Point</span><span class="o">&gt;</span> <span class="n">points</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>

<p>is correct, trying to optimize it by using resize() like:</p>
<div class="pygments_murphy"><pre><span class="kt">void</span> <span class="n">addVertex</span><span class="p">(</span><span class="n">Point</span> <span class="n">p</span><span class="p">){</span>
    <span class="n">points</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">points</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
    <span class="n">points</span><span class="p">[</span><span class="n">points</span><span class="p">.</span><span class="n">size</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">p</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>

<p>will usually be slower since it will do more memory allocations in the long term.</p>
<h3>push_front() is super slow</h3>
<p>A vector only grows from the end, if we add elements in the front it actually moves all the elements one position and adds the new element. So unless you are not concerned with performance don't use push_front. If you need to add elements both in the front and the back very often, then you probably want to use a list or a deque.</p>
<p>If you only need to add elements in the front, add them in the back and go through the vector in the opposite direction.</p>
<h3>pointers to elements in vectors: <strong>Don't</strong>!</h3>
<p>As i've said above things in a vector move when it needs more memory to grow, so pointers to elements in a vector can and probably will become invalid:</p>
<div class="pygments_murphy"><pre><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">;</span>
<span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="kt">int</span> <span class="o">*</span> <span class="n">p</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>

<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">i</span><span class="o">&lt;</span><span class="mi">100</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
    <span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>

<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">p</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">&amp;</span><span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>  <span class="c1">// will surely be different than p</span>
</pre></div>

<p>We can solve it by using vectors of pointers, storing positions in the vector, using std lists or using a vector as if it was a static array.</p>
<h3>using a vector as if it was a static array</h3>
<p>In c++ as a general rule, don't use arrays, a vector can do the same and the syntax is more understandable.</p>
<p>If for any reason you are thinking in using an array instead of a vector, you can always use a vector as if it was an array, just don't use push_back:</p>
<div class="pygments_murphy"><pre><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">(</span><span class="mi">100</span><span class="p">);</span>

<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">i</span><span class="o">&lt;</span><span class="mi">100</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
    <span class="n">v</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>

<p>What's the advantage of this over a plain c array? well, mainly it's easier to use, for example to copy the contents of a vector to another:</p>
<div class="pygments_murphy"><pre><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">(</span><span class="mi">100</span><span class="p">);</span>
<span class="c1">//...</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v2</span> <span class="o">=</span> <span class="n">v</span><span class="p">;</span>
</pre></div>

<p>while with arrays:</p>
<div class="pygments_murphy"><pre><span class="kt">int</span> <span class="n">v</span><span class="p">[</span><span class="mi">100</span><span class="p">];</span>
<span class="c1">//...</span>
<span class="kt">int</span> <span class="n">v2</span><span class="p">[</span><span class="mi">100</span><span class="p">];</span>
<span class="n">memcpy</span><span class="p">(</span><span class="n">v2</span><span class="p">,</span><span class="n">v</span><span class="p">,</span><span class="mi">100</span><span class="o">*</span><span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">));</span>
</pre></div>

<p>Or for example to pass an array as a parameter to a function you need to pass it's size in a different argument:</p>
<div class="pygments_murphy"><pre><span class="kt">void</span> <span class="n">doSomething</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span> <span class="n">array</span><span class="p">,</span> <span class="kt">int</span> <span class="n">size</span><span class="p">){</span>
<span class="p">...</span>
<span class="p">}</span>
</pre></div>

<p>and at the same time you have to keep that size in some variable making your code more complex. A vector carries it's size in it self, that's called encapsulation and it's the main reasons to use a vector over an array.</p>
<h3>vectors and threads</h3>
<p>I'm not going to enter into how threads work here but when working with threads and stl vectors keep in mind that:</p>
<ul>
<li>If you use a vector as an array, as explained above, you don't need to lock<a href="#5">[5]</a>, you won't get crashes. </li>
<li>If you need to change the vector size, then lock always that you access the vector elements both for reading and writing. And, very important, also when you access it's size. </li>
<li>If you check the size and then access the vector relying on the retrieved size, do it in the same lock. If not, the size can change while you unlock and lock again</li>
</ul>
<p>Also this post in the OF forum explains lots of details about threads and memory access:</p>
<p><a href="http://forum.openframeworks.cc/index.php?topic=7248.0O">http://forum.openframeworks.cc/index.php?topic=7248.0</a></p>
<h3>an OF example</h3>
<p>Here's an OF example that demoes the concepts explained in this article. </p>
<p><a href="https://github.com/arturoc/memoryExamples">https://github.com/arturoc/memoryExamples</a></p>
<p><a name="1">[1]</a>: Yes, a c array can also grow by using malloc, realloc and free instead of new and delete.</p>
<p><a name="2">[2]</a>: Theoretically the statements in this article about memory growing are dependent on the particular implementation but all the implementations i know behave like this.</p>
<p><a name="4">[4]</a>: This is a simplification but for most cases with vectors it's true</p>
<p><a name="4">[4]</a>: Sometimes, mostly when the vector is still small, there's enough unused memory after the last element and no reallocation is needed but most of the times when the vector changes it's internal size it needs to move it's elements to a new location.</p>
<p><a name="5">[5]</a>: There's other reasons for locking apart from having crashes, most of them explained in the forum thread in the link above.</p>]]></content:encoded>
    </item>
    <item>
      <title>Depth data steaming</title>
      <link>http://arturocastro.net/blog/2011/10/25/depth-data-steaming</link>
      <pubDate>Tue, 25 Oct 2011 15:10:00 CEST</pubDate>
      <category><![CDATA[Kinect]]></category>
      <category><![CDATA[Streaming]]></category>
      <category><![CDATA[ArtAndCode]]></category>
      <category><![CDATA[openFrameworks]]></category>
      <category><![CDATA[3D]]></category>
      <guid isPermaLink="true">http://arturocastro.net/blog/2011/10/25/depth-data-steaming</guid>
      <description>Depth data steaming</description>
      <content:encoded><![CDATA[<p><img alt="pointcloud" src="/images/kinectStream/img1.jpg" /></p>
<p>Some days ago this <a href="http://twitter.com/#!/JoelGethinLewis/status/126374532649979905">tweet</a> got me intrigued. Some hours later Joel asked for help to <a href="http://twitter.com/mrdoob">@mrdoob</a> since him and <a href="http://twitter.com/marcinignac">@marcinignac</a> did some pointcloud visualization in the browser using mrdoob's Three.js library during OFFF 2011. I had some code for streaming using gstreamer in openFrameworks so it was just a matter of joining the pieces.</p>
<p><a href="http://twitter.com/JoelGethinLewis">@joelgethinlewis</a> and <a href="http://twitter.com/roxlu">@roxlu</a> were trying to make this work at <a href="&quot;http://artandcode.com/3d">Art and code 2011</a> which topic this year was DIY 3D sensing and visualization.</p>
<p>--more--</p>
<p><a href="http://twitter.com/roxlu">@Roxlu</a> almost had this running using ffmpeg, the main problem with this approach is that for each client connected to the server there was going to be a stream, and probably the server and the bandwidth weren't going to be enough. The key was to have the server only producing one stream and some online service streaming it to the clients. In the end we didn't manage to make this run because of problems with cross-site security in browsers so probably <a href="http://twitter.com/roxlu">@roxlu</a>'s solution would have worked the same.</p>
<p>There's a great service for free streaming called <a href="http://giss.tv">giss.tv</a>. Yves one of the admins of the site has some python tools that actually use gstreamer. The same pipeline used by that tools with some modifications to get the depth info coming from the kinect worked without problem with <a href="https://github.com/openframeworks/openFrameworks/blob/master/libs/openFrameworks/video/ofGstUtils.h">ofGstUtils</a>.</p>
<p>Gstreamer has 2 elements which are really useful when you want to process custom data: appsrc, for feeding data into a pipeline and appsink for getting data out of it. appsink is used internally in OF to get data from cameras or video files and upload it to textures in the linux version of the video grabber and the video player.</p>
<p>Using appsrc is really easy to feed the depth data from the kinect into a pipeline and then stream it to <a href="http://giss.tv">giss.tv</a>. Since the video stream has color information (3 channels) and the depth data only 1 the red channel can be used to feed the depth data and the green one to send brightness, something like:</p>
<div class="pygments_murphy"><pre><span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">i</span><span class="o">&lt;</span><span class="mi">640</span><span class="o">*</span><span class="mi">480</span><span class="p">;</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
    <span class="n">pixels</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="n">kinect</span><span class="p">.</span><span class="n">getDepthPixels</span><span class="p">()[</span><span class="n">i</span><span class="p">];</span>
    <span class="n">pixels</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="mi">3</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">kinect</span><span class="p">.</span><span class="n">getPixels</span><span class="p">()[</span><span class="n">i</span><span class="o">*</span><span class="mi">3</span><span class="p">]</span> 
        <span class="o">+</span> <span class="n">kinect</span><span class="p">.</span><span class="n">getPixels</span><span class="p">()[</span><span class="n">i</span><span class="o">*</span><span class="mi">3</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> 
        <span class="o">+</span> <span class="n">kinect</span><span class="p">.</span><span class="n">getPixels</span><span class="p">()[</span><span class="n">i</span><span class="o">*</span><span class="mi">3</span><span class="o">+</span><span class="mi">2</span><span class="p">])</span> <span class="o">/</span> <span class="mi">3</span><span class="p">;</span>
    <span class="n">pixels</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="mi">3</span><span class="o">+</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">// feed pixels into the gstreamer streaming pipeline</span>
</pre></div>

<p>The blue channel is unused here so it's even possible to send the raw depth data returned by kinect, which is 16bits, using r &amp; g and b for brightness or do some kind of duplication of the depth data to have more chances of reconstructing it later avoiding compression artifacts.</p>
<p>In HTML5 you can get the pixel data of any element, for example a video and upload it to the graphics card in a texture using webGL. Then using some shaders <a href="http://twitter.com/mrdoob">@mrdoob</a> and <a href="http://twitter.com/kcmic">@kcmic</a> managed to separate the depth data from the brightness to generate a point cloud.</p>
<p>The main problems we had were with cross-site security in browsers which didn't allowed to use the stream directly from <a href="http://giss.tv">giss.tv</a> so in the last minute we had to do a php script which read the stream and served it as if it was comming from the same server as the web page. This was a really ugly hack and as soon as 1000 petitions came when <a href="http://twitter.com/golan">@golan</a> tweeted about the stream the server couldn't handle it.</p>
<p>The other problem was that theora compression (or any other video compression for that matter) is actually optimized for images not depth data so there was some really noticeable artifacts in the final point cloud. </p>
<p>The source code is <a href="http://github.com/arturoc/kinectStreaming">here</a></p>
<p>--col2--</p>
<p><img alt="chris sugrue" src="/images/kinectStream/img2.jpg" /><br/>
<a href="http://twitter.com/chrissugrue">@chrissugrue</a> talking about her lastest work <a href="http://vimeo.com/30834797">Base8</a></p>
<p><img alt="golan and kyle" src="/images/kinectStream/img3.jpg" /><br/>
<a href="http://twitter.com/golan]">@golan</a> and <a href="http://twitter.com/kcmic">@kcmic</a> preparing the stage</p>
<p><img alt="compression artifacts" src="/images/kinectStream/img4.jpg" /><br/>
Same image as above but the perspective is slightly different from that of the kinect, allowing to see the artifacts introduced by the theora compression in the depth data</p>
<p><img alt="first transmission" src="/images/kinectStream/img5.jpg" /><br/>
Raw depth image, the first data we managed to stream</p>]]></content:encoded>
    </item>
    <item>
      <title>Faces. How it works.</title>
      <link>http://arturocastro.net/blog/2011/10/25/faces.-how-it-works.</link>
      <pubDate>Tue, 25 Oct 2011 13:40:00 CEST</pubDate>
      <category><![CDATA[FaceSubstitution]]></category>
      <category><![CDATA[FaceTracking]]></category>
      <category><![CDATA[WorkInProgress]]></category>
      <category><![CDATA[openFrameworks]]></category>
      <guid isPermaLink="true">http://arturocastro.net/blog/2011/10/25/faces.-how-it-works.</guid>
      <description>Faces. How it works.</description>
      <content:encoded><![CDATA[<p>An idea i'm working on with <a href="http://kylemcdonald.net">Kyle McDonald</a></p>
<iframe src="http://player.vimeo.com/video/29279198?title=0&amp;byline=0&amp;portrait=0" width="480" height="360" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe>

<p>--more--</p>
<p>Faces works mainly thanks to Jason Saragih's library for face tracking which can be found <a href="http://web.mac.com/jsaragih/FaceTracker/FaceTracker.html">here</a> </p>
<p>To make it easier to use <a href="http://kylemcdonald.net">Kyle McDonald</a> developed some months ago the OF addon <a href="https://github.com/kylemcdonald/ofxFaceTracker">ofxFaceTracker</a>. This addon returns a mesh which vertexes match the facial features found in a picture of a face. To understand better how it works take a look at this video which shows the raw output of Jason's library:</p>
<iframe src="http://player.vimeo.com/video/26193188?title=0&amp;byline=0&amp;portrait=0" width="480" height="360" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe>

<p>The returned vertexes are always the same in the same order for every face, which makes it extremely easy to get the face in a photo and adapt it to match a face found in a video.</p>
<p>In openGL, if you pass a mesh and a texture for that mesh to the graphics card, moving the vertexes makes the texture stretch or srink accordingly. So to adapt the face in the photo to the one in the video you just need to move the vertexes of the mesh in the photo to match the ones in the video, indeed you just need to use the mesh of the video with the texture and texture coordinates of the photo, something like:</p>
<div class="pygments_murphy"><pre><span class="kt">void</span> <span class="n">testApp</span><span class="o">::</span><span class="n">update</span><span class="p">(){</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">i</span><span class="o">&lt;</span><span class="n">meshVideo</span><span class="p">.</span><span class="n">getNumVertices</span><span class="p">();</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">meshVideo</span><span class="p">.</span><span class="n">addTexCoord</span><span class="p">(</span><span class="n">meshPhoto</span><span class="p">.</span><span class="n">getVertex</span><span class="p">(</span><span class="n">i</span><span class="p">));</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="n">testApp</span><span class="o">::</span><span class="n">draw</span><span class="p">(){</span>
    <span class="n">video</span><span class="p">.</span><span class="n">draw</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">photo</span><span class="p">.</span><span class="n">getTextureReference</span><span class="p">().</span><span class="n">bind</span><span class="p">();</span>
    <span class="n">meshVideo</span><span class="p">.</span><span class="n">draw</span><span class="p">();</span>
    <span class="n">photo</span><span class="p">.</span><span class="n">getTextureReference</span><span class="p">().</span><span class="n">unbind</span><span class="p">();</span>
<span class="p">}</span>
</pre></div>

<p>Something like this will make the result look very unatural cause skin tones and lighting are usually different in the photo and the video. To correct for that we use some color interpolation. To put it simple we take the color for each vertex in the photo and in the video make an average and use that as the color for the mesh that is going to be drawn. The graphics card does the rest by interpolating the color of each vertex to the rest of the texture. (The actual algorithm is a little bit more complex than this)</p>
<div class="pygments_murphy"><pre><span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">i</span><span class="o">&lt;</span><span class="n">meshVideo</span><span class="p">.</span><span class="n">getNumVertices</span><span class="p">();</span><span class="n">i</span><span class="o">++</span><span class="p">){</span>
    <span class="n">ofColor</span> <span class="n">colorPhoto</span> <span class="o">=</span> <span class="n">photo</span><span class="p">.</span><span class="n">getPixelsRef</span><span class="p">().</span><span class="n">getColor</span><span class="p">(</span><span class="n">meshPhoto</span><span class="p">.</span><span class="n">getVertex</span><span class="p">(</span><span class="n">i</span><span class="p">));</span>
    <span class="n">ofColor</span> <span class="n">colorVideo</span> <span class="o">=</span> <span class="n">video</span><span class="p">.</span><span class="n">getPixelsRef</span><span class="p">().</span><span class="n">getColor</span><span class="p">(</span><span class="n">meshVideo</span><span class="p">.</span><span class="n">getVertex</span><span class="p">(</span><span class="n">i</span><span class="p">));</span>
    <span class="n">ofFloatColor</span> <span class="n">dstColor</span> <span class="o">=</span> <span class="p">(</span><span class="n">colorPhoto</span> <span class="o">+</span> <span class="n">colorVideo</span><span class="p">)</span><span class="o">*</span><span class="mf">0.5</span>
    <span class="n">meshVideo</span><span class="p">.</span><span class="n">addColorCoord</span><span class="p">(</span><span class="n">dstColor</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>

<p>The source code and osx binaries can be found in <a href="http://github.com/arturoc/FaceSubstitution">my github</a>. Take into account that this cannot be used commercially since Jason's Face Tracking library can only be used for research purposes.</p>]]></content:encoded>
    </item>
  </channel>
</rss>
