<?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[C++ std::map eigende Compare Funktion]]></title><description><![CDATA[<p>Hatte mal ne Frage warum folgender Code funktioniert:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;
#include &lt;algorithm&gt;
#include &lt;map&gt;
#include &lt;cctype&gt;

bool comp(const std::string s1, const std::string s2)
{
	return s1 &lt; s2;
}

using co = bool(const std::string, const std::string);

int main()
{
	std::map&lt;std::string, std::size_t, co*&gt; counter(comp);

	std::string word;

	while(std::cin &gt;&gt; word)
	{
		for(auto &amp;c	:	word)
			c = tolower(c);
		auto punc = std::remove_if(word.begin(), word.end(), ispunct);
		word.erase(punc, word.end());
		++counter[word];
	}

	for( const auto &amp;o	:	counter)
		std::cout &lt;&lt; &quot;Word: &quot; &lt;&lt; o.first &lt;&lt; &quot; appears &quot; &lt;&lt; o.second &lt;&lt; (o.second &gt; 1 ? &quot; times&quot; : &quot; time&quot;) &lt;&lt; std::endl;

	return 0;
}
</code></pre>
<p>Aber dieser ihr nicht:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;
#include &lt;algorithm&gt;
#include &lt;map&gt;
#include &lt;cctype&gt;

bool comp(const std::string s1, const std::string s2)
{
	return s1 &lt; s2;
}

//using co = bool(const std::string, const std::string);

int main()
{
	std::map&lt;std::string, std::size_t, (bool(const std::string,const std::string))*&gt; counter(comp);

	std::string word;

	while(std::cin &gt;&gt; word)
	{
		for(auto &amp;c	:	word)
			c = tolower(c);
		auto punc = std::remove_if(word.begin(), word.end(), ispunct);
		word.erase(punc, word.end());
		++counter[word];
	}

	for( const auto &amp;o	:	counter)
		std::cout &lt;&lt; &quot;Word: &quot; &lt;&lt; o.first &lt;&lt; &quot; appears &quot; &lt;&lt; o.second &lt;&lt; (o.second &gt; 1 ? &quot; times&quot; : &quot; time&quot;) &lt;&lt; std::endl;

	return 0;
}
</code></pre>
<p>Die eigentliche Aufgabe aus dem Buch:</p>
<pre><code>multiset&lt;Sales_data, decltype(compareIsbn)*&gt;
bookstore(compareIsbn);
</code></pre>
<pre><code>Exercise 11.11: Redefine bookstore without using decltype.
</code></pre>
<p>Aus der Fehlermeldung werde ich nicht schlau.<br />
Bin echt ein bisschen ratlos. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Kann ich denn ersten Code eigentlich so stehen lassen also das mit using? Oder ist das irgendwie ein ganz schlechter Programmierstil oder so?</p>
<p>mfG<br />
Jonas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/325132/c-std-map-eigende-compare-funktion</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Jul 2026 00:03:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325132.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Apr 2014 22:42:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++ std::map eigende Compare Funktion on Tue, 15 Apr 2014 22:42:23 GMT]]></title><description><![CDATA[<p>Hatte mal ne Frage warum folgender Code funktioniert:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;
#include &lt;algorithm&gt;
#include &lt;map&gt;
#include &lt;cctype&gt;

bool comp(const std::string s1, const std::string s2)
{
	return s1 &lt; s2;
}

using co = bool(const std::string, const std::string);

int main()
{
	std::map&lt;std::string, std::size_t, co*&gt; counter(comp);

	std::string word;

	while(std::cin &gt;&gt; word)
	{
		for(auto &amp;c	:	word)
			c = tolower(c);
		auto punc = std::remove_if(word.begin(), word.end(), ispunct);
		word.erase(punc, word.end());
		++counter[word];
	}

	for( const auto &amp;o	:	counter)
		std::cout &lt;&lt; &quot;Word: &quot; &lt;&lt; o.first &lt;&lt; &quot; appears &quot; &lt;&lt; o.second &lt;&lt; (o.second &gt; 1 ? &quot; times&quot; : &quot; time&quot;) &lt;&lt; std::endl;

	return 0;
}
</code></pre>
<p>Aber dieser ihr nicht:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;
#include &lt;algorithm&gt;
#include &lt;map&gt;
#include &lt;cctype&gt;

bool comp(const std::string s1, const std::string s2)
{
	return s1 &lt; s2;
}

//using co = bool(const std::string, const std::string);

int main()
{
	std::map&lt;std::string, std::size_t, (bool(const std::string,const std::string))*&gt; counter(comp);

	std::string word;

	while(std::cin &gt;&gt; word)
	{
		for(auto &amp;c	:	word)
			c = tolower(c);
		auto punc = std::remove_if(word.begin(), word.end(), ispunct);
		word.erase(punc, word.end());
		++counter[word];
	}

	for( const auto &amp;o	:	counter)
		std::cout &lt;&lt; &quot;Word: &quot; &lt;&lt; o.first &lt;&lt; &quot; appears &quot; &lt;&lt; o.second &lt;&lt; (o.second &gt; 1 ? &quot; times&quot; : &quot; time&quot;) &lt;&lt; std::endl;

	return 0;
}
</code></pre>
<p>Die eigentliche Aufgabe aus dem Buch:</p>
<pre><code>multiset&lt;Sales_data, decltype(compareIsbn)*&gt;
bookstore(compareIsbn);
</code></pre>
<pre><code>Exercise 11.11: Redefine bookstore without using decltype.
</code></pre>
<p>Aus der Fehlermeldung werde ich nicht schlau.<br />
Bin echt ein bisschen ratlos. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Kann ich denn ersten Code eigentlich so stehen lassen also das mit using? Oder ist das irgendwie ein ganz schlechter Programmierstil oder so?</p>
<p>mfG<br />
Jonas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394810</guid><dc:creator><![CDATA[CraftPlorer]]></dc:creator><pubDate>Tue, 15 Apr 2014 22:42:23 GMT</pubDate></item><item><title><![CDATA[Reply to C++ std::map eigende Compare Funktion on Tue, 15 Apr 2014 22:47:40 GMT]]></title><description><![CDATA[<p>CraftPlorer schrieb:</p>
<blockquote>
<pre><code>Exercise 11.11: Redefine bookstore without using decltype.
</code></pre>
</blockquote>
<p>Der Stern kömmt woanders hin.</p>
<pre><code>std::map&lt;std::string, std::size_t, bool(*)(const std::string,const std::string)&gt; counter(comp);
</code></pre>
<p>CraftPlorer schrieb:</p>
<blockquote>
<p>Kann ich denn ersten Code eigentlich so stehen lassen also das mit using? Oder ist das irgendwie ein ganz schlechter Programmierstil oder so?</p>
</blockquote>
<p>Alles ist besser als &quot;bool(*)(const std::string,const std::string)&quot;, fürchte ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394812</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 15 Apr 2014 22:47:40 GMT</pubDate></item><item><title><![CDATA[Reply to C++ std::map eigende Compare Funktion on Tue, 15 Apr 2014 22:52:44 GMT]]></title><description><![CDATA[<p>So muss das lauten:</p>
<pre><code>std::map&lt;std::string, std::size_t, bool(*)(const std::string,const std::string)&gt; counter(comp);
</code></pre>
<p>Warum? Was besseres als &quot;das ist eben die Syntax fuer Funktionszeiger&quot; faellt mir da auch nicht als Erklaerung ein.</p>
<p>Zum using: Klar, kannst du so machen. Macht eben einen neuen Typen namens co in dem fraglichen Namensraum bekannt. Mit allem, was man dafuer oder dagegen sagen kann.</p>
<p>edit: volkard war mal wieder viel schneller...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394815</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Apr 2014 22:52:44 GMT</pubDate></item><item><title><![CDATA[Reply to C++ std::map eigende Compare Funktion on Wed, 16 Apr 2014 06:03:50 GMT]]></title><description><![CDATA[<p>Alternativ kannst du auch das Sternchen ganz weglassen:</p>
<pre><code>std::map&lt;..., bool(...)&gt;
</code></pre>
<p>Der Compiler macht dann da automatisch eins dran.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394824</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 16 Apr 2014 06:03:50 GMT</pubDate></item><item><title><![CDATA[Reply to C++ std::map eigende Compare Funktion on Wed, 16 Apr 2014 07:21:47 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Alternativ kannst du auch das Sternchen ganz weglassen:</p>
<pre><code>std::map&lt;..., bool(...)&gt;
</code></pre>
<p>Der Compiler macht dann da automatisch eins dran.</p>
</blockquote>
<p>Echt, in Typ-Übergaben auch?<br />
Würde mich stören, dann könnte ich per TMP gar nicht prüfen, ob was ein Zeiger auf eine Funktion oder eine Funktion ist. (Nicht, daß ich das schonmal gebraucht hätte.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394832</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 16 Apr 2014 07:21:47 GMT</pubDate></item><item><title><![CDATA[Reply to C++ std::map eigende Compare Funktion on Wed, 16 Apr 2014 07:38:58 GMT]]></title><description><![CDATA[<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Der Compiler macht dann da automatisch eins dran.</p>
</blockquote>
<p>Echt, in Typ-Übergaben auch?</p>
</blockquote>
<p>Nein, das ist völlig falsch. Ein Funktionszeiger und eine Funktion sind verschiedene Typen. Kannst du auch mit <code>std::is_same</code> testen. Bei Map funktioniert auch nicht beides, da eine Deklaration des Vergleichers in der Form der GCC-Standardbibliothek:</p>
<pre><code>_Key_compare _M_key_compare;
</code></pre>
<p>mit einem Funktionstyp nicht erlaubt wäre (§14.3.1/3). Und ein Decay o.ä. ist da selbstverständlich nirgends vorgeschrieben. Daher muss das ein Zeiger sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394837</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 16 Apr 2014 07:38:58 GMT</pubDate></item><item><title><![CDATA[Reply to C++ std::map eigende Compare Funktion on Wed, 16 Apr 2014 07:56:45 GMT]]></title><description><![CDATA[<p>Danke euch allen.</p>
<p>EDIT: Hat sich schon erledigt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2394839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2394839</guid><dc:creator><![CDATA[CraftPlorer]]></dc:creator><pubDate>Wed, 16 Apr 2014 07:56:45 GMT</pubDate></item></channel></rss>