Question

J'ai des vecteurs d'objets de classe A:

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

etc

il existe une fonction avec un vecteur de pointeurs de A:

 std::vector<A *> *arranged;

Ce que je dois faire est de mettre les vecteurs de V1, V2, etc. à l'intérieur arrangés sans les détruire à la fin, alors j'ai pensé qu'un vecteur de pointeurs sur 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 en agencés?

Imaginez que vous ayez temporairement besoin de trier 3 vecteurs d'objets en un seul, mais que vous ne vouliez pas gâcher la mémoire des 3 vecteurs.

ty,

Joe

Était-ce utile?

La solution

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

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

Autres conseils

Si je vous comprends bien, vous avez plusieurs vecteurs contenant un type d’objet (A) et vous souhaitez créer un nouveau vecteur contenant la composition de tous les membres des autres vecteurs ne copiant pas réellement les objets environnants, ou autrement déranger leurs vecteurs propres de quelque façon?

Premièrement: la vie du nouveau vecteur composite existe-t-elle vraiment, de sorte qu'aucun de ses vecteurs source ne changera? Autrement dit, vous ne pouvez pas simplement avoir des pointeurs bruts dans les vecteurs source 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 " alors vous devez envisager d’utiliser des pointeurs partagés, ou quelque chose de similaire, de telle sorte que la modification des vecteurs source ne laissera pas votre vecteur composite dans un état invalide (c’est-à-dire qu’il ne pointe pas vers la mémoire aléatoire).

En supposant que les vecteurs source restent inchangés en termes de contenu propre pendant toute la durée de vie de votre composite, la réponse simple est "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 devez y insérer le contenu (par copie) de source1-3, puis le trier (ou vous pouvez utiliser un conteneur trié et trier lorsque 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 un algorithme de tri quelconque aux objets cibles eux-mêmes.

Est-ce que cela vous aide?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top