Добавление нескольких значений в вектор

у меня есть вектор ints, который я хочу добавить несколько значений, но слишком много значений, чтобы добавить, используя много push_backs. Есть ли способ добавления нескольких значений в конце вектора. Что-то вроде этого:--5-->

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

я обнаружил, что boost имеет что-то вроде этого, но мне бы не хотелось включать boost.

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

using namespace boost::assign;

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

который, кажется, объявлен следующим образом:

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++/C++11 сделать это или, если нет, как будет ли она реализована?

6 ответов


вы можете просто сделать оператор:

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

Это должно работать:

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

возможно вставить:

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

демо.


чтобы представить как можно больше решений, это тоже должно работать:

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

демо.


вы можете имитировать толчок 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;
}

затем,

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

посмотреть here


вы можете сделать это с помощью функции-члена insert, как таковой:

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

был предыдущий ответ, который опустил средний аргумент в параметрах вставки, но этот не работает. Существует несколько форматов для метода insert, которые можно найти здесь и фрагмент кода, который я написал, практически следует этому формату:

vectorName.insert (положение для начала ввода значений, первое значение для ввода, сколько значений enter)

Примечание: последние два аргумента (т. е. myarr, myarr+8) используют арифметику указателей. myarr-это адрес в памяти первого элемента массива, а второе значение-адрес 8-го элемента. Вы можете прочитать об арифметике указателя здесь.

надеюсь, что это поможет!