<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Komplexer Ausdruck im vector suchen]]></title><description><![CDATA[<p>Folgendes Problem:<br />
Es existiert ein vector in dem nach folgender Bedingung gesucht werden soll:<br />
(value<sub>n+1</sub> - value<sub>n</sub>) &lt; (value<sub>n</sub> - value<sub>n-1</sub>)</p>
<p>Hat jemand eine jede Idee welche STL-Algorithmen ich hier anwenden muss.<br />
Ich habe mir meinen eigenen Algorithmus geschrieben, würde aber lieber mit den STL Algorithmen rumwerkeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327597/komplexer-ausdruck-im-vector-suchen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Jul 2026 22:44:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327597.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 21 Aug 2014 12:00:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Komplexer Ausdruck im vector suchen on Thu, 21 Aug 2014 12:00:57 GMT]]></title><description><![CDATA[<p>Folgendes Problem:<br />
Es existiert ein vector in dem nach folgender Bedingung gesucht werden soll:<br />
(value<sub>n+1</sub> - value<sub>n</sub>) &lt; (value<sub>n</sub> - value<sub>n-1</sub>)</p>
<p>Hat jemand eine jede Idee welche STL-Algorithmen ich hier anwenden muss.<br />
Ich habe mir meinen eigenen Algorithmus geschrieben, würde aber lieber mit den STL Algorithmen rumwerkeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414454</guid><dc:creator><![CDATA[case]]></dc:creator><pubDate>Thu, 21 Aug 2014 12:00:57 GMT</pubDate></item><item><title><![CDATA[Reply to Komplexer Ausdruck im vector suchen on Thu, 21 Aug 2014 12:17:02 GMT]]></title><description><![CDATA[<p>Wenn du nur einmal suchen musst, dann <code>std::find_if</code> .</p>
<p>Falls du mehrfach suchen musst zuerst mit <code>std::sort</code> sortieren und dann <code>std::bsearch</code> verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414456</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Thu, 21 Aug 2014 12:17:02 GMT</pubDate></item><item><title><![CDATA[Reply to Komplexer Ausdruck im vector suchen on Thu, 21 Aug 2014 12:21:54 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>Wenn du nur einmal suchen musst, dann <code>std::find_if</code> .</p>
</blockquote>
<p>Geht nicht wenn die Bedingung von den Nachbarn abhängt.</p>
<p>icarus2 schrieb:</p>
<blockquote>
<p>Falls du mehrfach suchen musst zuerst mit <code>std::sort</code> sortieren und dann <code>std::bsearch</code> verwenden.</p>
</blockquote>
<p>bsearch? Du meinst wohl lower_bound. Geht aber nicht im Fall das OP.</p>
<p>@OP: Geht nicht ausschliesslich mit der STL ohne einen Hilfsvektor. Ist es ok für dich, Boost.Range zu verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414457</guid><dc:creator><![CDATA[huh]]></dc:creator><pubDate>Thu, 21 Aug 2014 12:21:54 GMT</pubDate></item><item><title><![CDATA[Reply to Komplexer Ausdruck im vector suchen on Thu, 21 Aug 2014 12:42:20 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Vieleicht ist das ganze falsch rüber gekommen.<br />
Value<sub>n-1</sub> und Value<sub>n+1</sub> meint die Werte rechts und links neben n.<br />
find_if kann ich hier glaub ich nicht verwenden, da ich immer nur den aktuellen<br />
iterator kriege und nicht rechts und links die Werte.<br />
Boost::Range kann ich leider nicht verwenden, da ich einen uralt Compiler (Borland Cbuilder 5.0) im Einsatz habe.<br />
Boost::bind kann ich aber benutzen.<br />
Im Moment habe ich das Ganze so gelöst, finde ich aber nicht so toll</p>
<pre><code>#include &lt;vector&gt;
#include &lt;functional&gt;
#include &lt;iterator&gt;
#include &lt;iostream&gt;
#include &lt;boost/next_prior.hpp&gt;

using std::vector ;
using std::back_inserter ;
using std::plus ;
using std::copy ;
using std::ostream_iterator ;
using std::cout ;

template &lt;class InputIterator,class BinaryOperation,class CompareOperation&gt;
  InputIterator find_difference(InputIterator first, InputIterator last,BinaryOperation binary_op,CompareOperation compare)
{
	if (first!=last)
	{				
		InputIterator next ;
		InputIterator prev=first ;
		while ((next=boost::next(first))!=last)
		{						
			if (prev!=first)
			{
				if (compare(binary_op(*next,*first),binary_op(*first,*prev)))
					return first ;
			}				
			++first ;			
			prev=boost::prior(first) ;
		}
	}
	return last ;
}

int main()
{
	vector&lt;int&gt; data ;
	for (int i=0;i&lt;11 ;i++)
		data.push_back(i) ;
	data.push_back(3) ;
	data.push_back(5) ;
	data.push_back(1) ;
	copy(data.begin(),data.end(),std::ostream_iterator&lt;int,char&gt;(cout,&quot;,&quot;)) ;
	cout &lt;&lt; &quot;\n&quot; ;

	vector&lt;int&gt;::iterator finditer=find_difference(data.begin(),data.end(),std::minus&lt;int&gt;(),std::less&lt;int&gt;()) ;	
	if (finditer!=data.end() &amp;&amp; finditer!=data.begin())
		std::cout &lt;&lt; &quot;iter : &quot; &lt;&lt; *finditer &lt;&lt; &quot; iter-1 : &quot; &lt;&lt; *boost::prior(finditer) ;
	//copy(new_values.begin(),new_values.end(),std::ostream_iterator&lt;int,char&gt;(cout,&quot;,&quot;)) ;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2414460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414460</guid><dc:creator><![CDATA[case]]></dc:creator><pubDate>Thu, 21 Aug 2014 12:42:20 GMT</pubDate></item><item><title><![CDATA[Reply to Komplexer Ausdruck im vector suchen on Thu, 21 Aug 2014 13:07:17 GMT]]></title><description><![CDATA[<p>huh schrieb:</p>
<blockquote>
<p>icarus2 schrieb:</p>
<blockquote>
<p>Wenn du nur einmal suchen musst, dann <code>std::find_if</code> .</p>
</blockquote>
<p>Geht nicht wenn die Bedingung von den Nachbarn abhängt.</p>
</blockquote>
<p>Frage meinerseits dabei:<br />
Die STl-Algorithmen (in unserem Fall std::find_if) erwarten ja etwas, das wie eine Funktion aufrufbar ist. Also wenn gewünscht auch ein Funktionsobjekt, welches einen zustand speichern kann.</p>
<p>Könnte man dann nicht bei der ersten Iteration einfach den Wert speichern, und bei der zweiten bzw. dritten Iteration dann die jeweils alten Werte mit in die Rechnung mit einbeziehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414461</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 21 Aug 2014 13:07:17 GMT</pubDate></item><item><title><![CDATA[Reply to Komplexer Ausdruck im vector suchen on Thu, 21 Aug 2014 14:29:03 GMT]]></title><description><![CDATA[<p>Anders aufgescheieben ist das</p>
<pre><code>x[n-1] - 2*x[n] + x[n+1] &lt; 0
</code></pre>
<p>wobei die linke Seite einer Annäherung der zweiten Ableitung entspricht. Du suchst also Stellen mit negativer Krümmung.</p>
<p>Ich war kurz davor Boost's Range-Adapter vorzuschlagen, weil ich in Erinnerung hatte, dass da ein Adapter dabei ist, der zwei benachbarte Elemente auf etwas anderes mappen kann (z.B. ihre Differenz) und so damit das &quot;Signal&quot; 2mal hintereinander ableiten könnte. Aber es gibt leider doch nur <a href="http://www.boost.org/doc/libs/1_55_0/libs/range/doc/html/range/reference/adaptors/reference.html" rel="nofollow">adjacent_filtered</a>. Schade.</p>
<p>Vielleicht lohnt sich ja für Dich auch eine Filter-Funktion, die einen Vektor auf einen anderen abbildet und dabei einen beliebigen linearen Filter anwenden kann (wie z.B. einen Differentiator 1. oder 2. Ordnung).</p>
<p>In Rust könnte man das jetzt schön mit <a href="http://doc.rust-lang.org/std/slice/trait.ImmutableSlice.html#tymethod.windows" rel="nofollow">windows</a> machen. <a href="http://is.gd/uJyXBG" rel="nofollow">SCNR!</a></p>
<p>So etwas wäre in C++ natürlich auch möglich, also einen Iterator, der über alle 3-elementige Vector-Ausschnitte rüberläuft und dann die Krümmung über ein Skalarprodukt ausrechnet. Gibt's nur leider nicht eingebaut, sowas.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414467</guid><dc:creator><![CDATA[kkaw]]></dc:creator><pubDate>Thu, 21 Aug 2014 14:29:03 GMT</pubDate></item><item><title><![CDATA[Reply to Komplexer Ausdruck im vector suchen on Thu, 21 Aug 2014 15:40:35 GMT]]></title><description><![CDATA[<p>Danke an euch alle.<br />
Lebe jetzt mit meinem oben beschriebenen Template.<br />
Ist nicht so toll, funktioniert aber.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414475</guid><dc:creator><![CDATA[case]]></dc:creator><pubDate>Thu, 21 Aug 2014 15:40:35 GMT</pubDate></item><item><title><![CDATA[Reply to Komplexer Ausdruck im vector suchen on Fri, 22 Aug 2014 08:16:14 GMT]]></title><description><![CDATA[<p>sollte die funktion nicht besser <code>find_first_difference</code> heissen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414560</guid><dc:creator><![CDATA[esac]]></dc:creator><pubDate>Fri, 22 Aug 2014 08:16:14 GMT</pubDate></item><item><title><![CDATA[Reply to Komplexer Ausdruck im vector suchen on Fri, 22 Aug 2014 08:22:30 GMT]]></title><description><![CDATA[<p>Stimmt, werde ich anpassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414561</guid><dc:creator><![CDATA[case]]></dc:creator><pubDate>Fri, 22 Aug 2014 08:22:30 GMT</pubDate></item></channel></rss>