2016-04-13 13 views
3

配列の逆順に同じ配列の末尾にコピーしたいと同時に、値の代数記号を変更したいと思います。配列を逆順にコピー

それはそのような何か:

void foo() 
{ 
    std::vector<int> vec; 
    for(int = 0; i < 5; i++) 
    { 
     vec.push_back(i); 
    } 

    //Now i want the values in vec to be copied to the end in reverse order. 
    //I would like to have something like that : 
    std::copy(std::end(vec), std::begin(vec), std::back_inserter(vec)) 

    //so now vec should look like: 0 1 2 3 4 4 3 2 1 0 
    //But I want: 0 1 2 3 4 -4 -3 -2 -1 -0 

} 

は、既存のstd標準関数は、私は私が(partition_copyか何かのように)やりたい微調整することができますか私は多分、私自身のことを使わなければいけないことがあり、適切なラムダ関数を持つstd :: for_eachのようなものですか?

+2

これは['std :: transform'](http://en.cppreference.com/w/cpp/algorithm/transform)の仕事のようです。 –

答えて

7

あなたはリバースイテレータでstd::transformを組み合わせることができます:あなたは直接ループのために使用してアイテムをプッシュすることができます

vec.reserve(2 * vec.size()); // guarantee iterator validity 

std::transform(std::rbegin(vec), std::rend(vec), 
       std::back_inserter(vec), [](int n) { return -n; }); 
+0

[デモ](http://ideone.com/grcRcy) –

+0

ありがとうございました! – FreddyKay

+0

逆イテレータに問題があります(VS2013以外の場合)。私はあなたのコードを試して、それはアサーションをスローします。 'Expression:ベクトルイテレータはデクリメントできません'。とにかくイテレータが無効になるようです。私は順方向イテレータに切り替えるとすべてが動作します。 述語としてlamdaの代わりにBTWを使用すると、機能から 'std :: negate'を使用できます。 – teivaz

0

、唯一の違いは、2番目のforループは逆の順番と変更された符号でその中にアイテムを追加することです。

void foo() 
{ 
std::vector<int> vec; 
int i; 
for(i=0; i<5; i++)  //Loop to Add Items 
     vec.push_back(i); 
for(i=4; i>=0; i--)  //Loop to Add Items in Reverse Order with Signs Changed 
     vec.push_back(i * -1); 
for(i=0; i<vec.size(); i++) 
     cout<<vec[i]<<" "; 
}