Sto cercando di risolvere un tipo di concurrent_vector, dove hits_object
è:Come ordinare vettore di puntatore a struct
struct hits_object{
unsigned long int hash;
int position;
};
Ecco il codice che sto utilizzando:
concurrent_vector<hits_object*> hits;
for(i=0;...){
hits_object *obj=(hits_object*)malloc(sizeof(hits_object));
obj->position=i;
obj->hash=_prevHash[tid];
hits[i]=obj;
}
Ora ho riempito uno concurrent_vector<hits_object*>
chiamato hits
.
Ma voglio ordinare questo concurrent_vector sulla proprietà position !!!
Ecco un esempio di ciò che è all'interno di una tipica colpi oggetto:
0 1106579628979812621
4237 1978650773053442200
512 3993899825106178560
4749 739461489314544830
1024 1629056397321528633
5261 593672691728388007
1536 5320457688954994196
5773 9017584181485751685
2048 4321435111178287982
6285 7119721556722067586
2560 7464213275487369093
6797 5363778283295017380
3072 255404511111217936
7309 5944699400741478979
3584 1069999863423687408
7821 3050974832468442286
4096 5230358938835592022
8333 5235649807131532071
Voglio risolvere la questione sulla base della prima colonna ("posizione" di tipo int
). La seconda colonna è "hash" di tipo unsigned long int
.
Ora ho provato a fare quanto segue:
std::sort(hits.begin(),hits.end(),compareByPosition);
dove compareByPosition
è definito come:
int compareByPosition(const void *elem1,const void *elem2)
{
return ((hits_object*)elem1)->position > ((hits_object*)elem2)->position? 1 : -1;
}
ma io continuo a ricevere errori di segmentazione quando ho messo nella linea std::sort(hits.begin(),hits.end(),compareByPosition);
Si prega di aiuto!
http : //stackoverflow.com/questions/328955/how-to-use- stdsort-with-a-vector-of-structures-and-compare-function –
1/Sei sicuro di aver davvero bisogno di memorizzare i puntatori? Secondo il codice che ci hai fornito, direi che memorizzare i valori sarebbe probabilmente più facile e meno soggetto a errori. Se vuoi davvero memorizzare i puntatori, puoi dare un'occhiata a [Boost Pointer Container Library] (http://www.boost.org/doc/libs/release/libs/ptr_container/doc/ptr_container.html), o in ['boost :: indirect_iterator'] (http://www.boost.org/doc/libs/release/libs/iterator/doc/indirect_iterator.html). 2/Non dovresti usare 'malloc' per creare le tue istanze, usa' new' invece: 'malloc' non costruirà l'oggetto, solo allocare ... –
... un po 'di memoria. 3/Per aggiungere elementi nel tuo contenitore, dovresti probabilmente usare 'push_back' o un metodo simile, a meno che il contenitore non sia già pieno. L'operatore '[]' viene utilizzato per accedere agli elementi già presenti nel contenitore, non per aggiungerne di nuovi. Il codice che hai dato dati in scrittura ad un certo punto in memoria che non era riservato (beh, supponendo che 'concurrent_vector' sia simile a' std :: vector' e ai mi piace). –