Ответ 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;
}
У меня есть вектор 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 для этого или, если нет, как он будет реализован?
Вы можете просто сделать оператор:
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 } );
Возможно, с insert:
values.insert( values.end(), {3, 9, 2, 5, 8, etc} );
Демо.
Чтобы представить как можно больше решений, это тоже должно работать:
for(const auto x : {11, 12, 13, 14})
v.push_back(x);
Демо.
Вы можете имитировать поведение 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
Вы можете сделать это, используя функцию-член вставки:
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-го элемента. Вы можете прочитать об арифметике указателя здесь.
Надеюсь, что это поможет!