Ошибка vector subscript out of range
Вообщем, я занимаюсь по книге Страуструпа и у меня не получается сделать довольно простое задание.
- Напишите две функции, обращающие порядок следования элементов в объекте типа vector. Например, вектор 1 , 3, 5, 7, 9 становится вектором 9, 7, 5, 3, 1 . Первая функция, изменяющая порядок следования элементов на противоположный, должна создавать новый объект класса vector, а исходный объект класса vector должен оставаться неизменным . Другая функция должна изменять порядок следования элементов в передаваемом ей векторе без использования других векторов. Указан11е: воспользуйтесь функцией swap.
#include <iostream>
#include <vector>
//создает новый вектор new vector swap
std::vector<int> nv_swap(std::vector<int>& nv, const std::vector<int> ov)
{
nv.reserve(ov.size());
int j = ov.size();
for (int i : ov)
{
nv[j] = i;
--j;
}
return nv;
}
//преобразует старый вектор old vector swap
void ov_swap(std::vector<int>& v)
{
}
int main()
{
const std::vector<int> ov{ 1 , 3, 5, 7, 9 };
std::vector<int> nv;
nv_swap(nv, ov);
/*std::cout << nv[1];*/
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Ну, раз вы работаете с конкретно vector<int>, то...
#include <vector>
#include <iostream>
using namespace std;
void inPlaceReverse(vector<int>& v)
{
for(size_t i = 0, j = v.size()-1; i < j; ++i, --j)
{
int t = v[i]; v[i] = v[j]; v[j] = t;
// Или короче — swap(v[i],v[j]);
}
vector<int> newReverse(const vector<int>& v)
{
vector<int> cp(v);
inPlaceReverse(cp);
return cp;
}
int main(int argc, char * argv[])
{
vector<int> src{1,3,5,7,9};
for(auto i: newReverse(src)) cout << i << " "; cout << endl;
inPlaceReverse(src);
for(auto i: src) cout << i << " "; cout << endl;
}
Или нужно с шаблонами/итераторами?
Конечно, можно написать копирование вектора в обратном порядке во второй функции... Но мне кажется, в этом нет никакого смысла: проще скопировать и развернуть скопированный вектор.