Problematik Templates



  • hallo,

    also ich habe folgenden code.

    test_template.cpp

    #include "includes.h"
    using namespace std;
    
    template<class T>
    void sortieren(vector<T>& sort)
    {
    	vector<T> &neusortieren = sort;
    
    	for( T i = 1;i<neusortieren.size();++i)
    	{
    		for( T j = 0; j<i;++j)
    		{
    			if(neusortieren[i] = neusortieren[j])
    			{
    				T temp = neusortieren[i];
    				neusortieren[i] = neusortieren[j];
    				neusortieren[i] = temp;
    			}
    		}
    	}
    
    	for(T i= 0 ;i<sort.size();++i)
    	{
    		cout<<neusortieren[i]<<endl;
    	}
    
    }
    

    die funktion sollte einen vector übergeben bekommen, von der main und dann eine sortierung nach bubble durchführen.

    jetzt die main
    main.cpp

    #include "includes.h"
    #include"test_template.cpp"
    
    using namespace std;
    
    int main()
    {
    	vector<int> testvector;
    	int abfrage;
    
    	do
    	{
    		cin>>abfrage;
    		testvector.push_back(abfrage);
    	}while(abfrage != 99);
    
    	sortieren(testvector);
    
    	system("pause");
    
    }
    

    so und hier wird ein eingabe gemacht in einen vector welcher dann übergeben werden soll.

    Folgendes problem, egal was ich eingebe, mir wird jedesmal nichts sortiert sondern immer nur die erste zahl angezeigt die ich eingegeben habe.natürlich wird diese zahl so oft angezeigt wie zahlen im vector sind.Ich kann mir das problem net erklären. weiß einer weiter, wäre über eure hilfe sehr dankbar


  • Mod

    Compilerwarnungen einschalten und beachten.



  • ahh ok...leider kann ich mit der warnung ent so viel anfangen, vielei ihr besser ich poste sie einfach mal hier

    test_template.cpp(10) : warning C4018: '<': Konflikt zwischen 'signed' und 'unsigned'
    
    main.cpp(18): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void sortieren<int>(std::vector<_Ty> &)".
    
    \test_template.cpp(23) : warning C4018: '<': Konflikt zwischen 'signed' und 'unsigned'
    

    hoffe ihr könnt mir helfen



  • verwende vector<T>::iterator zum iterieren und nicht sowas wie "T i"



  • meinst du damit, das direkt mit in die shcleife zu schreiben? das vector<T>::iterator...oder vorher einen iter erstellen und dann einsetzen? sorry sind meine esten gehversuche mit Templates 😕



  • und dein Fehler liegt darin das du eine Anweisung auf ihren Wahrheitswert prüfst ... nicht eine Bedingung:

    if (neusortieren[i] = neusortieren[j])
    

    ... Da ist der Fehler 😛

    Aja und das mitm Ausgeben kann man per std::ostream_iterator nen ganzes bissel eleganter lösen:

    std::copy(sort.begin(), sort.end(), std::ostream_iterator<T>(std::cout, "\n"));
    

    ...
    =>

    #include <vector>
    #include <algorithm>
    #include <iostream>
    #include <iterator>
    
    template <typename T>
    void sort(std::vector<T>& sort)
    {
        for (std::size_t i = 1; i < sort.size(); ++i)
            for (std::size_t j = 0; j < i; ++j)
                if (sort.at(i) == sort.at(j))
                    std::swap(sort.at(i), sort.at(j));
    }
    
    int main()
    {
        std::cout << "Geben Sie die Zahlen, durch ein Leerzeichen getrennt, ein: " << std::flush;
        std::vector<int> dest;
        std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(),
         std::back_inserter(dest)); 
        sort<int>(dest);
        std::cout << "Sortiert: " << std::endl;
        std::copy(dest.begin(), dest.end(), std::ostream_iterator<T>(std::cout, "\n"));
    }
    

    🙂

    Bearbeitung
    Für thorkd und da es sich um einen std. Container handelt:

    template <typename T>
    void sort(std::vector<T>& sort)
    {
        for (std::vector<T>::iterator it = sort.begin() + 1; it != sort.end(); ++it)
            for (std::vector<T>::iterator it_x = sort.begin(); it_x != sort.end(); ++it_x)
                if (*it == *it_x)
                    std::swap(*it, *it_x);
    }
    

    ...



  • (D)Evil schrieb:

    Bearbeitung
    Für thorkd und da es sich um einen std. Container handelt:

    template <typename T>
    void sort(std::vector<T>& sort)
    {
        for (std::vector<T>::iterator it = sort.begin() + 1; it != sort.end(); ++it)
            for (std::vector<T>::iterator it_x = sort.begin(); it_x != sort.end(); ++it_x)
                if (*it == *it_x)
                    std::swap(*it, *it_x);
    }
    

    ...

    Schau dir mal iter_swap an 😉



  • Firefighter schrieb:

    meinst du damit, das direkt mit in die shcleife zu schreiben? das vector<T>::iterator...oder vorher einen iter erstellen und dann einsetzen? sorry sind meine esten gehversuche mit Templates 😕

    wie du den iterator verwendest ist eigentlich egal. man sollte sich nur davor hüten, templates zu schreiben, die jeglichen typ als parameter erlauben, dann aber annahmen darüber treffen, was fürn typ kommt.
    du gehst in deiner schleife z.b. davon aus, dass du einen primitiven typ wie int erhältst. dein template kann aber mit allem möglichen aufgerufen werden, z.b. einer klasse als template parameter. und da c++ indirekte initialisierung für bestimmte klassen nach der art "Foo f = 3" erlaubt, kann es zu so dermaßen kryptischen compilefehlern kommen, dass man sich bei umfangreichereren templates nen wolf sucht, bis man den fehler gefunden hat.


Anmelden zum Antworten