web-dev-qa-db-ja.com

ベクトルに複数の値を追加する

複数の値を追加したいintのベクトルがありますが、多くのPush_backsを使用して追加するには値が多すぎます。ベクトルの最後に複数の値を追加する方法はありますか?これに沿った何か:

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

ブーストにはこのようなものがあることがわかりましたが、ブーストを含める必要はありません。

#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の方法はありますか、そうでない場合はどのように実装されますか?

14
Eejin

あなたはただ演算子を作ることができます:

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
0x499602D2

これは機能するはずです:

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

おそらく 挿入

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

デモ

5
Columbo

可能な限り多くの解決策を提示するために、これも機能するはずです。

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

デモ

4
Tacet

ブーストを模倣することができます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 を参照してください

3
P0W

これは、メンバーの挿入関数を使用して行うことができます。

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

挿入パラメーターの中央の引数を省略した以前の回答がありましたが、それは機能しません。挿入メソッドには従うべきいくつかの形式があり、それらは見つけることができます ここ そして私が書いたコードスニペットは実際にはこの形式に従います:

vectorName.insert(値の入力を開始する位置、最初に入力する値、入力する値の数)

注:最後の2つの引数(つまり、myarr、myarr + 8)はポインター演算を使用することに注意してください。 myarrは、配列の最初の要素のメモリ内のアドレスであり、2番目の値は8番目の要素のアドレスです。ポインタ演算について読むことができます ここ

お役に立てば幸いです。

1
nopenopenope