2010-12-10 4 views
1

J'ai un type comme celui-ci:Vecteur de Type à Tableau de Type :: Membre?

class Foo { 
public: 
    int bar[3]; 
    /*Possibly some other members in here*/ 
}; 

Qu'est-ce qu'un moyen efficace d'obtenir un std:vector<Foo> à un tableau de int? Le tableau doit être un mappage séquentiel de bar le Foos du vecteur.

Est-ce suffisant?

int* array = new int[foos.size() * 3]; 
int offset = 0; 
BOOST_FOREACH(Foo& f, foos) { 
    memcpy(array + offset, f.bar, sizeof(int) * 3); 
    offset += sizeof(int) * 3; 
} 

Ou est-il une meilleure façon?

+0

Je suis confus ... vous demandez d'obtenir un vecteur mais vous utilisez ':: operator new' pour allouer un tableau? –

+0

Non. Je demande un tableau. Il doit aller à une librairie tierce qui attend un tableau d'ints. – Anthony

Répondre

1
std::vector<int> ivect; 
std::transform(foovect.begin(), foovect.end(), std::back_inserter(ivect), 
    [](Foo const& f) -> int { return f.bar; }); 

Si vous n'avez pas de support lambda bien sûr, vous devrez faire un foncteur pour faire la même chose. Boost.Bind serait un bon endroit pour commencer à cette fin.

^^^ Je n'ai pas compris la question. Pour ce faire:

int * array = new int[foos.size() * 3]; // of course, using this datatype is dumb. 
int counter = 0; 
std::for_each(foos.begin(), foos.end(), [=array,&counter](Foo const& f) 
    { 
    for (int i = 0; i < 3; ++i) array[counter++] = f.bar[i]; 
    }); 
2

Pourquoi faire l'effort de faire un appel memcpy? Je voudrais simplement parcourir tous les éléments et copier (en utilisant l'opérateur d'affectation) dans le nouveau tableau.

Questions connexes