Подтвердить что ты не робот

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

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

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

Есть ли способ С++/С++ 11 для этого или, если нет, как он будет реализован?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Возможно, с insert:

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

Демо.

Ответ 4

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

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

Демо.

Ответ 5

Вы можете имитировать поведение 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;
}

Затем

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

См. here

Ответ 6

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

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(postion для начала ввода значений, первого значения для ввода, количества введенных значений)

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

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