2009-10-22 7 views
1

J'ai des vecteurs d'objets de classe A:Comment avoir un vecteur de valeur et utiliser un vecteur de pointeurs en conjonction?

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

etc

il y a une fonction avec un vecteur de pointeurs de A:

std::vector<A *> *arranged; 

ce que je dois faire est de mettre la les vecteurs de V1, V2 etc à l'intérieur arrangés sans les détruire à la fin, donc j'ai pensé qu'un vecteur de pointeurs vers ces objets ... est-ce possible? Si oui, pouvez-vous me donner un exemple d'itération avec la variable V1 et ajouter des pointeurs de ces objets dans arrangé? Imaginez que vous ayez temporairement besoin de trier 3 vecteurs d'objets en un seul vecteur, mais vous ne voulez pas gâcher la mémoire des 3 vecteurs.

ty,

Joe

Répondre

2

Vous pouvez écrire votre propre comparateur. Dans ce cas, le comparateur travaillerait sur A*. Un exemple simple en utilisant int Type:

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; 
} 
+0

Salut, merci pour la réponse, donc quand j'ajoute le pointeur à l'élément dans le vecteur, il ne serait pas en train de copier, mais juste en pointant? Mon problème pour comprendre cela est que le vecteur a des tas et pas de tas, alors comment une fonction externe peut-elle pointer vers lui? ou est-ce que je viens de gâcher les conceptions? quand vous push_back quelque chose à l'intérieur du vecteur le crée-t-il à nouveau mais sur le tas? – Jonathan

+0

En poussant du contenu dans 'vec 'quand on pousse les adresses des variables dans' first' et 'second'.Lors du tri 'vec ', les valeurs seront comparées mais les pointeurs eux-mêmes seront échangés dans' vec'. – AraK

+0

Merci, j'ai encore quelques questions concernant le hean et la pile mais j'étudierai sur google. Marqué votre réponse et a donné un point, merci! – Jonathan

0

Si je vous comprends bien - vous avez plusieurs vecteurs contenant un certain type d'objet (A), et que vous voulez créer un nouveau vecteur contenant la composition de tous les membres de l'autre les vecteurs ne copieraient pas les objets autour, ou ne dérangeraient en rien leurs propres vecteurs? Premièrement: la vie du nouveau vecteur composite existe-t-elle définitivement de telle sorte qu'aucun de ses vecteurs source ne change? C'est-à-dire que vous ne pouvez pas avoir des pointeurs bruts dans les vecteurs sources de votre vecteur composite si ces pointeurs sont invalidés pendant la durée de vie de votre composite. Si la réponse à cette question est autre que «définitivement, les pointeurs resteront valides», vous devez envisager d'utiliser des pointeurs partagés, ou quelque chose de similaire, de sorte que la modification des vecteurs source ne laisse pas votre vecteur composite invalide. état (c'est-à-dire ne pas le laisser pointer sur une mémoire aléatoire).

En supposant que les vecteurs-sources restent inchangés en termes de leur propre contenu pour la durée de vie de votre composite, alors la réponse est simple: « Oui »

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) 

Pour le vecteur composite, vous avez besoin pour y mettre le contenu (par copie) de source1-3, puis le trier (ou vous pouvez utiliser un conteneur trié, et trier comme vous insérez les éléments). Vous devrez définir votre propre opérateur de tri, qui déréférencera les pointeurs et appliquera n'importe quel algorithme de tri sur les objets cibles eux-mêmes.

Cela vous aide-t-il?

+0

cela a aidé, mais le vecteur ne restera pas vivant à la fin de la portée, c'est un pointeur comme je l'ai décrit, mais juste parce qu'il sera utilisé par une autre fonction et à la fin de la fonction principale, je vais supprimer – Jonathan

+0

Comprendre réellement ce que sont les pointeurs, la durée de vie des objets et ainsi de suite, est essentiel à la réussite de la programmation C++. Avoir un conteneur de pointeurs nécessite que les choses qu'ils pointent restent valables pendant tout le temps où ils sont pointés! Ainsi, la source1-3 ne peut pas être détruite (hors de portée), ni leur contenu ne peut changer (vous ne pouvez pas insérer d'objets, ou les réorganiser) ou bien les pointeurs en composite pointent vers des informations aléatoires (au lieu des objets que vous vouliez eux à). Je recommande fortement Scott Myers série efficace C++ si vous ne l'avez pas encore lu. ;) – Mordachai

Questions connexes