2014-11-11 36 views
13

Mam wektor ints, który chcę dodać wiele wartości zbyt, ale zbyt wiele wartości do dodania przy użyciu wielu push_backs. Czy istnieje metoda dodawania wielu wartości na końcu wektora. Coś w tym stylu:Dodawanie wielu wartości do wektora

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

Stwierdziłem, że wzmocnienie ma coś takiego, ale nie chciałbym dodawać wzmocnienia.

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

using namespace boost::assign; 

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

który wydaje się być zadeklarowane tak:

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

Czy istnieje C++/C++ 11 sposobów, aby to zrobić, a jeśli nie, to jak by to być realizowane?

+0

cóż ... możesz użyć kodu doładowania, który właśnie przeczytałeś i powieliłeś. – djechlin

+0

Nieco powiązany jest http: // stackoverflow.com/q/14561941/3235496 – manlio

Odpowiedz

3

Można po prostu zrobić operatora:

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

Istnieje irytujący problem z tym, że nigdy nie znalazłem dobrego rozwiązania; jeśli umieścisz tę funkcję w globalnej przestrzeni nazw, a następnie spróbujesz użyć jej w przestrzeni nazw, gdzie zdefiniowałeś zupełnie innego operatora '= + =", to ta funkcja jest ukryta. Aby obejść to, musisz wykonać 'using :: operator + =' w dowolnym obszarze nazw, który deklaruje inny 'operator + ='. Ten nie został znaleziony przez ADL, ponieważ to by tylko sprawdziło 'namespace std' (i nie możemy tego umieścić w' namespace std', ponieważ kod użytkownika nie może tego zrobić). –

+0

@MattMcNabb Jestem tego świadomy. Powinienem dodać komentarz na ten temat. – 0x499602D2

+2

@ 0x499602D2: Nie jest za późno! –

22

To powinno działać:

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

można naśladować doładowania boost::assign zachowanie

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

Następnie

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

Zobacz here

4

Aby przedstawić jak najwięcej rozwiązań, powinno to działać zbyt:

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

Demo.

1

Można to zrobić za pomocą funkcji wkładka, jako takich:

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

Było poprzednia odpowiedź, że pominięto środkowy argumentu w parametrach INSERT, ale to nie działa. Istnieje kilka formatów, których należy przestrzegać dla metody wstawiania, którą można znaleźć pod następującym numerem: here, a fragment kodu, który napisałem, ma następujący format:

vectorName.insert (pozycja do rozpoczęcia wprowadzania wartości, pierwsza wartość do wprowadzenia, liczba wartości do wprowadź)

Uwaga: Te ostatnie dwa argumenty (np. myarr, myarr + 8) używają arytmetyki wskaźników. myarr to adres w pamięci pierwszego elementu w tablicy, a druga wartość to adres ósmego elementu. Możesz przeczytać o arytmetyzacji wskaźnika here.

Nadzieję, że pomaga!