2016-04-13 2 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 

} 

Есть ли станд стандартная функция уже существующих, что я могу настроить, чтобы делать то, что я хочу (как 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

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

+0

Большое спасибо! – FreddyKay

+0

Существует проблема с обратными итераторами (если только в VS2013). Я пробовал ваш код, и он выдает утверждение «Expression: vector iterator not decmentable». Похоже, что итератор все равно недействителен. Когда я переключаюсь на итератор вперед, все работает. BTW вместо lamda как предикат можно использовать 'std :: negate' от функционального – teivaz

0

Вы можете непосредственно раздвинуть элементы, используя цикл, только разница в том, что второй цикл будет добавить элементы в обратном порядке и что в измененном знаке.

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]<<" "; 
}