Ich habe einen Vektor mit einer großen Anzahl von Elementen. Nun möchte ich eine kleine Funktion schreiben, die die Anzahl der geraden oder ungeraden Elemente im Vektor zählt. Da die Leistung ein wichtiges Anliegen ist, möchte ich keine if-Anweisung in die Schleife einfügen. Also habe ich zwei kleine Funktionen geschrieben wie:
long long countOdd(const std::vector<int>& v)
{
long long count = 0;
const int size = v.size();
for(int i = 0; i < size; ++i)
{
if(v[i] & 1)
{
++count;
}
}
return count;
}
long long countEven(const std::vector<int>& v)
{
long long count = 0;
const int size = v.size();
for(int i = 0; i < size; ++i)
{
if(0 == (v[i] & 1))
{
++count;
}
}
return count;
}
Meine Frage ist, kann ich das gleiche Ergebnis durch das Schreiben einer einzigen Vorlage Funktion wie diese erhalten:
template <bool countEven>
long long countTemplate(const std::vector<int>& v1)
{
long long count = 0;
const int size = v1.size();
for(int i = 0; i < size; ++i)
{
if(countEven)
{
if(v1[i] & 1)
{
++count;
}
}
else if(0 == (v1[i] & 1))
{
++count;
}
}
return count;
}
Und es so zu verwenden:
int main()
{
if(somecondition)
{
countTemplate<true>(vec); //Count even
}
else
{
countTemplate<false>(vec); //Count odd
}
}
Wird der für die Vorlage und die Version ohne Vorlage generierte Code derselbe sein, oder werden zusätzliche Anweisungen ausgegeben?
Bitte beachten Sie, dass die Zählung der Zahlen nur der Veranschaulichung dient, schlagen Sie also bitte keine anderen Zählmethoden vor.
EDIT : Ok. Ich stimme zu, dass es vielleicht nicht viel Sinn aus Sicht der Leistung zu machen. Aber zumindest unter dem Gesichtspunkt der Wartbarkeit möchte ich nur eine Funktion statt zwei pflegen müssen.