2017-01-26 3 views
0
#include <iostream> 
#include <vector> 

using namespace std; 

template<typename T> 
void new_insertion_sort(std::vector<T> &v) 
{ 
    for(auto iter = v.begin(); iter != v.end(); ++iter) 
    { 
     auto j = iter; 
     std::cout << "1 "; 
     while(j > v.begin()) 
     { 
      if(*j > *j-1) // we do not want iterator here, but the value at that 
       {break;} 

      auto current = *j-1; // save for swap 
      *j-1 = *j; // swap 
      *j = current; // restore position before, without it the two adjacent would be the same 

      j--; 

     } 



    } 

} 


void insertion_sort(std::vector<double> &v) 
{ 
    for(int i = 0; i < v.size(); i++) 
    { 
     int j = i; 

     while(j > 0) 
     { 
      if(v[j] > v[j-1]) 
       {break;} 

      double current = v[j-1]; // save for swap 
      v[j-1] = v[j]; // swap 
      v[j] = current; // restore position before, without it the two adjacent would be the same 

      j--; 

     } 



    } 

} 

template<typename T> 
void print_vector(T v){ 

    for(auto &element: v) 
    { 
     std::cout << element << std::endl; 
    } 

} 

int main(int argc, char const *argv[]) 
{ 
    std::vector<double> v={5,4,3,2,7}; 
    std::vector<int> w={4,6,23,6,35,235,346,37,46}; 

    std::cout << " Dies ist der geordnete Vektor! " << std:: endl; 
    insertion_sort(v); 
    print_vector(v); 




    new_insertion_sort(v); 
    new_insertion_sort(w); 
    std::cout << " Dies ist der geordnete Vektor v ! " << std:: endl; 
    print_vector(v); 
    std::cout << " Dies ist der geordnete Vektor v ! " << std:: endl; 
    print_vector(w); 

    return 0; 
} 

In der ersten Funktion new_insertion_sort versuche ich eine Insertion-Sort-Funktion für generische Typen zu schreiben. Der Fehler kommt von den Zeilen, wo ich versuche "zu tauschen". Es soll den Wert in dem Vektor annehmen, in dem sich der Iterator gerade befindet (zum Beispiel bei Index 2 möchte ich den Wert erhalten) und ihn der anderen Position zuweisen. Der Fehler ist: insertion.cpp: 19: 9: Fehler: Ausdruck ist nicht zuweisbar * j-1 = * j; // SwapZeiger: Ausdruck nicht zuweisbar in C++

Ich bin mir ziemlich sicher, dass meine Verwirrung aus meinem armen Verständnis von Zeigern Stielen, so sind alle Tipps

geschätzt Zuerst versuchte ich es mit v [j-1] = v [j] usw. also die Iteratoren direkt in den geschweiften Klammern verwenden, aber das hat auch nicht funktioniert.

+1

Gerade jetzt scheint Ihre Verwirrung von nicht zu wissen/Verständnis der [Operator Vorrang von C++] (http://en.cppreference.com/w/cpp/language/operator_precedence). – WhozCraig

+0

Okay, das reparierte es, danke –

+0

Wenn Sie hier Code schreiben, würde ich empfehlen, die zusätzlichen Leerzeilen auf ein Minimum zu beschränken. Es macht nur Leser müssen mehr scrollen, um die relevanten Teile des Codes zu sehen. – crashmstr

Antwort

2

Sie haben einen Genauigkeitsfehler.

*(j-1) = *j; 

Das behebt es.

+1

Oder: 'j [-1] = j [0]' –