Funktion kürzen

06/09/2013 12:15 inc_p0int#1
Moin,

hat wer vielleicht eine Idee wie ich noch meine Funktion kürzen könnte?

Code:
std::string calculatePacketBuild(const std::string& packet)
{
	std::string calculatedPacket;
	char b;

	for(auto it : packet)
	{
		b = (char)(it - 0x20);

		if(b <= 0)
		{
			calculatedPacket += '1';
			continue;
		}

		b = (char)((char)(b + 0xF3) - 0x2);
		if(b <= 0)
		{
			calculatedPacket += '1';
			continue;
		}

		b = (char)(b - 0xB);
		if(b <= 0)
		{
			calculatedPacket += '1';
			continue;
		}

		b = (char)(b - 0xC5);
		if(b <= 0)
		{
			calculatedPacket += '1';
			continue;
		}

		calculatedPacket += '0';
	}

	return calculatedPacket;
}
Ich finde das in diesem Zustand derbst hässlich.

MfG
06/09/2013 12:35 Schlüsselbein#2
Code:
#include <algorithm>
#include <iostream>
#include <string>

struct packet_functor
{
	char operator()(char c) const
	{
		if((c -= 0x20) <= 0 || (c += 0xf3 - 0x2) <= 0 || (c -= 0xb) <= 0 || (c -= 0xc5) <= 0)
			return '1';
		return '0';
	}
};


int main()
{
	std::string s = "HIUEGIUDFTWZE8756345$%&/&)(§";
	std::transform(s.begin(), s.end(), s.begin(), packet_functor());
	std::cout << s << std::endl;
}
Falls es noch kürzer soll: Lambda benutzen. Endet aber im gleichen Code und sieht in dem Fall m.E. hässlicher aus.
06/09/2013 13:12 inc_p0int#3
Quote:
Originally Posted by Schlüsselbein View Post
Code:
#include <algorithm>
#include <iostream>
#include <string>

struct packet_functor
{
	char operator()(char c) const
	{
		if((c -= 0x20) <= 0 || (c += 0xf3 - 0x2) <= 0 || (c -= 0xb) <= 0 || (c -= 0xc5) <= 0)
			return '1';
		return '0';
	}
};


int main()
{
	std::string s = "HIUEGIUDFTWZE8756345$%&/&)(§";
	std::transform(s.begin(), s.end(), s.begin(), packet_functor());
	std::cout << s << std::endl;
}
Falls es noch kürzer soll: Lambda benutzen. Endet aber im gleichen Code und sieht in dem Fall m.E. hässlicher aus.
Danke, so gefällt es mir. :)

Noch eine andere Frage, wozu braucht man überhaupt Lambda Funktionen? Ich weiß wie die funktionieren, aber verstehe den Sinn dahinter nicht.

MfG
06/09/2013 13:15 Schlüsselbein#4
Lambdas sind nur ein syntaktisches Schmankerl. Der erzeugte Code sollte dem hier gleichen, da das erzeugte Objekt im normalfall sowieso eliminiert und Methode inlined wird.
06/09/2013 13:29 inc_p0int#5
Quote:
Originally Posted by Schlüsselbein View Post
Lambdas sind nur ein syntaktisches Schmankerl. Der erzeugte Code sollte dem hier gleichen, da das erzeugte Objekt im normalfall sowieso eliminiert und Methode inlined wird.
Ich verstehe, dann bedanke ich mich nochmal bei dir und der Thread währe erledigt.

MfG
06/09/2013 13:53 Raz9r#6
Quote:
Originally Posted by Schlüsselbein View Post
Code:
#include <algorithm>
#include <iostream>
#include <string>

struct packet_functor
{
	char operator()(char c) const
	{
		if((c -= 0x20) <= 0 || (c += 0xf3 - 0x2) <= 0 || (c -= 0xb) <= 0 || (c -= 0xc5) <= 0)
			return '1';
		return '0';
	}
};


int main()
{
	std::string s = "HIUEGIUDFTWZE8756345$%&/&)(§";
	std::transform(s.begin(), s.end(), s.begin(), packet_functor());
	std::cout << s << std::endl;
}
Falls es noch kürzer soll: Lambda benutzen. Endet aber im gleichen Code und sieht in dem Fall m.E. hässlicher aus.
Kleine Ergänzung: Wenn man den String nicht modifizieren möchte, sondern eher einen zweiten mit den jeweiligen Ergebnissen füllen möchte, kann man std::back_inserter benutzen.

Das sieht dann etwa so aus:
Code:
std::string packet = "HIUEGIUDFTWZE8756345$%&/&)(§";
std::string result;
std::transform(std::begin(packet), std::end(packet), std::back_inserter(result), packet_functor());
std::cout << packet << std::endl << result << std::endl;