Iterator, template ADDUP



  • Für einen Container mit dem Inhalt
    1 2 3 4 5 8
    liefert AddUp
    9 7 7

    also 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);
    
    }
    

  • Mod

    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


  • Mod

    Dein out_it ist für int, der muss für string sein.


  • Mod

    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.


Anmelden zum Antworten