web-dev-qa-db-fra.com

Ajouter plusieurs valeurs à un vecteur

J'ai un vecteur d'ints que je veux ajouter aussi plusieurs valeurs mais trop de valeurs à ajouter en utilisant beaucoup de Push_backs. Existe-t-il une méthode permettant d’ajouter plusieurs valeurs à la fin d’un vecteur? Quelque chose dans le sens de ceci:

std::vector<int> values
values += {3, 9, 2, 5, 8, etc};

J'ai trouvé que boost avait quelque chose comme ça, mais j'aimerais ne pas avoir à inclure boost.

#include <boost/assign/std/vector.hpp>

using namespace boost::assign;

{
    std::vector<int> myElements;
    myElements += 1,2,3,4,5;
}

Ce qui semble être déclaré comme ceci:

template <class V, class A, class V2>
inline list_inserter<assign_detail::call_Push_back<std::vector<V,A> >, V> 
operator+=( std::vector<V, A>& c, V2 v )
{
    return Push_back( c )( v );
}

Existe-t-il un moyen de faire cela avec C++/C++ 11 ou, sinon, comment serait-il implémenté?

13
Eejin

Vous pouvez simplement faire un opérateur:

template <class T>
std::vector<T>& operator+=(std::vector<T>& lhs, std::initializer_list<T> l)
{
    lhs.insert(std::end(lhs), l);
    return lhs;
}
3
0x499602D2

Cela devrait fonctionner:

std::vector<int> values;
values.insert( values.end(), { 1, 2, 3, 4 } );
24
Slava

Peut-être avec insérez :

values.insert( values.end(),  {3, 9, 2, 5, 8, etc} );

Démo .

5
Columbo

Afin de présenter autant que possible des solutions, ceci devrait également fonctionner:

for(const auto x : {11, 12, 13, 14})
    v.Push_back(x);

Démo .

4
Tacet

Vous pouvez imiter le comportement boost boost::assign

template <typename T> 
class vector_adder 
{
public:
    std::vector<T>& v;
    vector_adder(std::vector<T>& v):v(v)
    {  }

    vector_adder& operator,(const T& val)
    {  
       v.Push_back(val);
       return *this;
    }
};

template <typename T> 
vector_adder<T> operator+=(std::vector<T>& v,const T& x)
{
    return vector_adder<T>(v),x;
}

Ensuite,

 std::vector<int> v {1,2,3,4};
 v += 11,12,13,14 ;

Voir here

3
P0W

Vous pouvez le faire en utilisant la fonction insert member, comme ceci:

vector<int> v; 
int myarr[] {1, 2, 4, 5, 5, 6, 6, 8}; //brace initialization with c++11

v.insert(v.end(), myarr, myarr+8);

Une réponse précédente omettait l'argument du milieu dans les paramètres d'insertion, mais celui-ci ne fonctionnait pas. Il existe plusieurs formats à suivre pour la méthode insert, que vous pouvez trouver ici et le fragment de code que j'ai écrit suit pratiquement ce format:

vectorName.insert (position pour commencer à entrer des valeurs, première valeur à entrer, combien de valeurs à entrer)

Remarque: les deux derniers arguments (myarr, myarr + 8) utilisent l’arithmétique de pointeur. myarr est l'adresse en mémoire du premier élément du tableau et la deuxième valeur est l'adresse du 8e élément. Vous pouvez en savoir plus sur l'arithmétique de pointeur ici .

J'espère que cela pourra aider!

1
nopenopenope