Domanda

Ho alcuni vettori di oggetti di classe A:

 std::vector<A> *V1;
 std::vector<A> *V2;

etc

esiste una funzione con un vettore di puntatori di A:

 std::vector<A *> *arranged;

quello che devo fare è mettere i vettori da V1, V2 ecc all'interno disposti senza distruggerli alla fine, quindi ho pensato che un vettore di puntatori a quegli oggetti ... è possibile? se sì, puoi darmi un esempio di iterazione con la variabile V1 e aggiungere i puntatori di quegli oggetti in modo sistemato?

immagina che, temporaneamente, devi ordinare 3 vettori di oggetti in un vettore, ma non vuoi rovinare la memoria dei 3 vettori.

ty,

Joe

È stato utile?

Soluzione

Potresti scrivere il tuo comparatore. In questo caso, il comparatore funzionerebbe su A * . Un semplice esempio usando int tipo:

void fun(vector<int*>* vec)
{
  /////////
}

bool comp(int* lhs, int* rhs)
{
    return *lhs < *rhs;
}

int main()
{
    vector<int> first, second;
    vector<int*> vec;

    for(vector<int>::size_type i = 0; i < first.size(); ++i)
        vec.push_back(&first[i]);
    for(vector<int>::size_type i = 0; i < second.size(); ++i)
        vec.push_back(&second[i]);

    // write your own comparator! provided above: comp
    sort(vec.begin(), vec.end(), comp);

    fun(&vec);

    return 0;
}

Altri suggerimenti

Se ti capisco correttamente, hai diversi vettori contenenti un tipo di oggetto (A) e vuoi creare un nuovo vettore contenente la composizione di tutti i membri degli altri vettori senza copiare effettivamente gli oggetti, oppure altrimenti disturbare in qualche modo i propri vettori?

Primo: la vita del nuovo vettore composito esiste sicuramente in modo tale che nessuno dei suoi vettori sorgente cambierà? Cioè: non puoi avere solo puntatori grezzi nei vettori di origine dal tuo vettore composito se tali puntatori verranno invalidati durante la vita del tuo composito.

Se la risposta è diversa da " definitivamente, i puntatori rimarranno validi " allora devi considerare l'utilizzo di puntatori condivisi, o qualcosa di simile, in modo tale che la modifica dei vettori sorgente non lasci il tuo vettore composito in uno stato non valido (cioè non lo lasci puntare alla memoria casuale).

Supponendo che i vettori di origine rimarranno invariati in termini di contenuti per la durata del tuo composito, la risposta semplice è "Sì"

vector<A> source1;
vector<A> source2;
vector<A> source3;

vector<const A*> composite; // this is a sorted vector of the above vectors' contents (by pointer)

Per il vettore composito, è necessario inserire il contenuto (tramite copia) di source1-3 in esso, quindi ordinarlo (oppure è possibile utilizzare un contenitore ordinato e ordinare mentre si inseriscono gli elementi). Dovrai definire il tuo operatore di ordinamento, uno che dereferenzia i puntatori e applica qualunque algoritmo di ordinamento sugli oggetti target stessi.

Ti aiuta?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top