Iterator, template ADDUP
-
Für einen Container mit dem Inhalt
1 2 3 4 5 8
liefert AddUp
9 7 7also es werden immer die äusersten Addiert
Das ganze ist natürlich generisch zu machen.Hab soweit hinbekommen das es für int, double funktioniert, allerdings scheitert er dann am string.
hier das Modul:
#include <algorithm> #include <iostream> #include <iterator> template <typename TItor, typename TStream> void AddUp(TItor begin, TItor end, TStream &stream){ end--;//damit der end iterator auf das letzte element zeigt und nicht danach int size=1; TItor value=begin; while(value != end){ value++; size++; }//damit wird die größe des containers bestimmt if(size % 2 !=0){//prüft ob der container eine gerade oder ungerade größe besitzt while(begin != end){//container wird durchlaufen *stream++=*begin + *end;//addiert die werte und übergibt sie stream begin++; end--; } *stream=*begin; } else{ //ähnlich wie oben nur für ungerade größen TItor mid=begin; size=size/2; while(size>0){ mid++; size--; } while(begin != mid){ *stream++=*begin + *end; begin++; end--;; } } }Testtreiber:
#include <iostream> #include "add.h" #include <vector> #include <fstream> #include <iterator> #include <string> using namespace std; int main(){ ostream_iterator<int> out_it (cout,", "); vector<char> f; vector<string> s; s.push_back("AA"); s.push_back("BB"); s.push_back("CC"); s.push_back("DD"); s.push_back("EE"); f.push_back(1); f.push_back(2); f.push_back(3); f.push_back(5); f.push_back(6); f.push_back(8); AddUp(s.begin(), s.end(), out_it); }
-
und?
-
camper schrieb:
und?
?
es scheitert am string, also such ich nach ner methode z.b. string vector
"AA", "BB", "CC", "DD", "EE" vom
Value-Typ string liefert AddUp "AAEE" "BBDD"zurückgibt
gibts da ne eigene stl funktion oder was wär ne mögliche methode?
-
zeile 29
-
Dein out_it ist für int, der muss für string sein.
-
Ist so etwas gemeint?
template <typename BidirectionalIterator, typename OutputIterator> void AddUp(BidirectionalIterator begin, BidirectionalIterator end, OutputIterator out){ while ( begin != end ) *out++ = begin != --end ? *begin++ + *end : *begin; }
-
SeppJ schrieb:
Dein out_it ist für int, der muss für string sein.
das wars thx@camper
so gehts natürlich auch
-
Edit: Schwachsinn.