218 votes

Meilleur moyen pour concaténer deux vecteurs?

Je suis en utilisant multitreading et souhaitez fusionner les résultats.

ex:

std::vector<int> A;
std::vector<int> B;
std::vector<int> AB;

Je veux AB avoir à la table des matières de l'Un et le contenu de B dans cet ordre. Quel est le moyen le plus efficace de faire quelque chose comme ça?

Merci

366voto

Kirill V. Lyadvinsky Points 47627
AB.reserve( A.size() + B.size() ); // preallocate memory
AB.insert( AB.end(), A.begin(), A.end() );
AB.insert( AB.end(), B.begin(), B.end() );

83voto

Shirik Points 1517

C'est précisément ce que la fonction de membre std::vector::insert est pour

std::vector<int> AB = A;
AB.insert(AB.end(), B.begin(), B.end());

28voto

bradgonesurfing Points 8600

Dépend si vous en avez vraiment besoin de se concaténer les deux vecteurs ou vous voulez donner l'apparence de la concaténation de l'intérêt de l'itération. Le boost::rejoignez la fonction

http://www.boost.org/doc/libs/1_43_0/libs/range/doc/html/range/reference/utilities/join.html

vous donnera cette.

std::vector<int> v0;
v0.push_back(1);
v0.push_back(2);
v0.push_back(3);

std::vector<int> v1;
v1.push_back(4);
v1.push_back(5);
v1.push_back(6);
...

BOOST_FOREACH(const int & i, boost::join(v0, v1)){
    cout << i << endl;
}

devrait vous donner

1
2
3
4
5
6

Note boost::joignez-vous à ne pas copier les deux vecteurs dans un nouveau conteneur mais génère une paire d'itérateurs (gamme) qui couvrent la durée de les deux récipients. Il y aura des conséquences sur les performances, mais peut-être moins que la copie de toutes les données dans un nouveau conteneur d'abord.

14voto

aloisdg Points 1341

Basé sur Kiril V. Lyadvinsky travail, j'ai fait une nouvelle version. Cet extrait de l'utilisation modèle et la surcharge. Avec elle, vous pouvez écrire vector3 = vector1 + vector2 et vector4 += vector3. J'espère que ça peut aider.

template <typename T>
std::vector<T> operator+(const std::vector<T> &A, const std::vector<T> &B)
{
    std::vector<T> AB;
    AB.reserve( A.size() + B.size() );                // preallocate memory
    AB.insert( AB.end(), A.begin(), A.end() );        // add A;
    AB.insert( AB.end(), B.begin(), B.end() );        // add B;
    return AB;
}

template <typename T>
std::vector<T> &operator+=(std::vector<T> &A, const std::vector<T> &B)
{
    A.reserve( A.size() + B.size() );                // preallocate memory without erase original data
    A.insert( A.end(), B.begin(), B.end() );         // add B;
    return A;                                        // here A could be named AB
}

Si vous êtes paresseux, vous pouvez le télécharger directement ici.

0voto

Cogwheel Points 8656

Si votre vecteurs sont triés*, découvrez set_union de <algorithm>.

set_union(A.begin(), A.end(), B.begin(), B.end(), AB.begin());

Il y a une plus approfondie exemple dans le lien

*grâce rlbond

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X