2016-06-08 9 views
1

Ich habe eine Klasse sort_map:C++ Sortierklasse Vektor

class sort_map { 
    char key; 
    int val; 
    sort_map(int v, char k): key(k), val(v){} 
}; 
using namespace std; 
int comp_int(const void *a, const void *b) { 
    return (*(sort_map*)b).val - (*(sort_map*)a).val); 
} 
int main() { 
    vector <sort_map> v; 
    v.push_back(5, 'a'); 
    v.push_back(67, 'd'); 
    v.push_back(2, 'c'); 
    v.push_back(98, 'f'); 
    return 1; 
} 

Ich möchte den Vektor von val bestellen qsort verwenden, und es funktioniert nicht.

qsort(&v.begin(), v.size(), sizeof(sort_map), comp_int); 

Aber wenn ich diese verwenden, funktioniert es

qsort(&v[0], v.size(), sizeof(sort_map), comp_int); 

Kann mir jemand sagen, warum?

+14

Verwenden Sie stattdessen ['std :: sort'] (http://en.cppreference.com/w/cpp/algorithm/sort) – NathanOliver

+1

Warum? '& v.begin()' ruft die Adresse des Iterators ab, nicht die Daten, auf die der Iterator verweist. 'qsort' sucht am falschen Ort. – user4581301

+3

* Ich möchte den Vektor von val mit qsort * bestellen - Nein, vergiss es. Verwende 'std :: sort'. Und wenn dies eine "Voraussetzung für Ihre Aufgabe ist,' qsort' zu verwenden, [siehe hier] (http://ideone.com/g8tiPK). Der Rückgabewert von 0 aus 'std :: is_pod 'zeigt, dass Sie' sort_map' nicht mit qsort sortieren können, ohne undefiniertes Verhalten aufzurufen. – PaulMcKenzie

Antwort

-2

Versuch dies zu tun:

sort_map* ptr1 = &v[0]; 
sort_map* ptr2 = &v.begin(); 

Und Sie werden feststellen, welche kompiliert wird, und finden würde, dass diese Ausdrücke nicht gleich sind.

erste Anweisung würde kompilieren, da die Art der v[0]sort_map, daher &a auf sie angewendet würde es

sort_map*

Zweite Aussage des Basistyp ist vector<sort_map>::iterator, und seine Adresse wäre

iterator*

für diesen vector Typ. Wie Sie sehen können iterator* nicht sort_map* zugewiesen werden - sie sind nicht ähnlich.

qsort dauert void* ohne Typ-Sicherheit vom Compiler zu erzwingen. Ein void* kann jede Art von Zeiger übergeben werden, ohne dass eine Typumwandlung erforderlich ist, daher kompiliert es gut. Sie übergeben eine falsche Sache an qsort. Wie andere empfohlen, verwenden Sie besser std::sort