2014-11-11 28 views
13

Possiedo un vettore di int che voglio aggiungere anche più valori ma troppi valori da aggiungere utilizzando molto push_backs. Esiste un metodo per aggiungere più valori alla fine di un vettore. Qualcosa in questo senso:Aggiungere più valori a un vettore

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

Ho trovato che la spinta ha qualcosa di simile, ma mi piacerebbe non dover includere boost.

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

using namespace boost::assign; 

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

che sembra essere dichiarati in questo modo:

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

C'è qualche C++/C++ 11 modo per fare questo o, se non, come sarebbe essere attuata?

+0

beh ... potresti usare il codice boost appena letto e riprodurlo. – djechlin

+0

Un po 'correlato è http: // StackOverflow.it/q/14561941/3235496 – manlio

risposta

3

si può solo fare un operatore:

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

C'è un problema fastidioso con questo che non ho mai trovato davvero una buona soluzione; se metti questa funzione nel namespace globale e poi provi ad usarla in uno spazio dei nomi in cui hai definito un 'operatore + =' completamente diverso, allora questa funzione è nascosta. Per ovviare a questo devi fare 'using :: operator + =' in qualsiasi namespace che dichiari un altro 'operator + ='. Questo non è stato trovato da ADL dato che controllerebbe solo 'namespace std' (e non possiamo inserirlo nello spazio dei nomi' std' perché il codice utente non può farlo). –

+0

@MattMcNabb Ne sono consapevole. Avrei dovuto aggiungere un commento a riguardo. – 0x499602D2

+2

@ 0x499602D2: non è troppo tardi! –

4

Forse con insert:

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

Demo.

22

Questo dovrebbe funzionare:

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

È possibile simulare la spinta boost::assign comportamento

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

Poi,

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

Vedi here

4

Al fine di presentare il più possibile soluzioni, questo dovrebbe funzionare anche:

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

Demo.

1

È possibile farlo utilizzando la funzione di elemento di inserto, in quanto tale:

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

C'era una risposta precedente che omette l'argomento centrale nei parametri di inserimento, ma che uno non funziona. Ci sono diversi formati da seguire per il metodo insert, che può essere trovato here e lo snippet di codice che ho scritto praticamente segue questo formato:

vectorName.insert (posizione per iniziare a immettere valori, primo valore da inserire, quanti valori a invio)

Nota: che gli ultimi due argomenti (es. myarr, myarr + 8) utilizzano l'aritmetica del puntatore. myRAR è l'indirizzo in memoria del primo elemento dell'array e il secondo valore è l'indirizzo dell'8 ° elemento. È possibile leggere l'aritmetica del puntatore here.

Spero che questo aiuti!

Problemi correlati