Excellent stuff, I&#39;ve put it into a test_hayne.cpp file, and attached it to a bug report.<br><br>Sylvain and I are debugging stuff stuff now, we&#39;ll add it to the test suite :)<br><br>thanks again,<br><font color="#888888">Paul<br>
</font><br><br><div class="gmail_quote">2008/11/11 Sam Hayne <span dir="ltr">&lt;<a href="mailto:Sam.Hayne@gmx.de">Sam.Hayne@gmx.de</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="Ih2E3d"><br>
Paul Harris wrote:<br>
<br>
&gt; Hi Sam,<br>
<br>
&gt; great email, lots of detail<br>
<br>
</div>Thx. If it helps you in any way I&#39;m glad.<br>
(Hope those issues weren&#39;t all caused by VS or my edits. :D )<br>
<div class="Ih2E3d"><br>
&gt; 3.1)<br>
&gt; &gt; I always ended up with runtime errors using erase(). &nbsp;:(<br>
<br>
&gt; Could you please boil it down to a simple test case?&nbsp; (eg look at<br>
test_kdtree.cpp, just make up a new .cpp file that builds a tree and then &gt;<br>
somehow crashes or asserts).<br>
<br>
<br>
</div>Puhh... wasn&#39;t that easy to create an simple example (as in my case I got<br>
the points out of a bitmap).<br>
But here a bit lengthy one - it crashes deterministically each time.<br>
<br>
In my case erase() failed to delete point (41, 189)... deleting some other<br>
point instead.<br>
Eventually resulting in this runtime error:<br>
<a href="http://img359.imageshack.us/img359/4623/runtimeerrordz4.jpg" target="_blank">http://img359.imageshack.us/img359/4623/runtimeerrordz4.jpg</a><br>
<br>
<br>
//=======<br>
//Defs:<br>
//========<br>
<div class="Ih2E3d"><br>
struct duplet {<br>
 &nbsp; &nbsp; &nbsp; &nbsp;typedef int value_type;<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;inline value_type operator[](size_t const N) const { return d[N]; }<br>
 &nbsp; &nbsp; &nbsp; &nbsp;inline bool operator==(duplet const&amp; other) const<br>
 &nbsp; &nbsp; &nbsp; &nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return this-&gt;d[0] == other.d[0] &amp;&amp; this-&gt;d[1] == other.d[1];<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;inline bool operator!=(duplet const&amp; other) const<br>
 &nbsp; &nbsp; &nbsp; &nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return this-&gt;d[0] != other.d[0] || this-&gt;d[1] != other.d[1];<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;value_type d[2];<br>
</div> &nbsp; &nbsp; &nbsp; &nbsp;//typedef boost::shared_ptr&lt;duplet&gt; ptr;<br>
};<br>
<div class="Ih2E3d"><br>
typedef KDTree::KDTree&lt;2, duplet,<br>
std::pointer_to_binary_function&lt;duplet,int,double&gt; &gt; duplet_tree_type;<br>
<br>
inline double return_dup( duplet d, int k ) { return d[k]; }<br>
<br>
<br>
<br>
<br>
</div>//=======<br>
//main:<br>
//========<br>
<div class="Ih2E3d"><br>
 &nbsp; &nbsp; &nbsp; &nbsp;duplet_tree_type dupl_tree_test(std::ptr_fun(return_dup));<br>
</div> &nbsp; &nbsp; &nbsp; &nbsp;std::vector&lt;duplet&gt; vDuplets;<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;//srand(time(0));<br>
 &nbsp; &nbsp; &nbsp; &nbsp;int randy1 = 0;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;int randy2 = 0;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;for (int i=0; i&lt;700; i++)<br>
 &nbsp; &nbsp; &nbsp; &nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//create coordinate for new duplet<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;randy1+=2;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;randy1=randy1%255;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;randy2+=3;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;randy2=randy2%255;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//randy1 = rand() % 255;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//randy2 = rand() % 255;<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//new duplet<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;duplet super_dupre = { {randy1, randy2} };<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//check if duplet with same coordinate already in<br>
vector/tree. If not: insert in vector and tree<br>
<div class="Ih2E3d"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;duplet_tree_type::iterator pItr =<br>
</div>dupl_tree_test.find_nearest(super_dupre,std::numeric_limits&lt;double&gt;::max()).<br>
first;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (*pItr!=super_dupre)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dupl_tree_test.insert(super_dupre);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;vDuplets.push_back(super_dupre);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;dupl_tree_test.optimise();<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;int elements;<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;while (vDuplets.size()&gt;0) //delete all duplets from tree which are<br>
in the vector<br>
 &nbsp; &nbsp; &nbsp; &nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;elements = vDuplets.size();<br>
<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;duplet element_to_erase = vDuplets.back();<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;vDuplets.pop_back();<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dupl_tree_test.erase(element_to_erase); //erase() : will<br>
probably erase wrong element sooner or later<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//dupl_tree_test.erase_exact(element_to_erase);<br>
//erase_exact(): works<br>
<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//debug stuff:<br>
<div class="Ih2E3d"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;duplet_tree_type::iterator pItr =<br>
</div>dupl_tree_test.find_nearest(element_to_erase,std::numeric_limits&lt;double&gt;::ma<br>
x()).first;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;duplet nearest_to_element = *pItr;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (nearest_to_element==element_to_erase)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// element still in tree... wrong element must have<br>
been erased<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int u = 7; //set breakpoint here<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
<br>
<br>
</blockquote></div><br>