Развернуть вектор, начиная с минимального элемента
Есть вектор vect, состоящий из N элементов, и нужно развернуть вектор(записать в обратном порядке) начиная с минимального элемента вектора.
vector<int>::iterator min = vect.begin();
int k = 0;
for (int i=0; i < N; i++)
{
if (vect[i] < *min)
{
*min = vect[i];
k = i;
}
}
Нашел номер минимального элемента: k и сам минимальный элемент: min. Дальше пытаюсь через итератор min поменять местами элементы:
for (int i = 0; i < (N - k)/2; i++)
{
int chng;
chng = *(min + i);
*(min + i) = *(vect.end()-1 - i);
*(vect.end()-1 - i) = chng;
}
Ответы (2 шт):
Автор решения: ВЛ 80
→ Ссылка
Воспользуйтесь инструментами стандартной библиотеки из заголовка <algorithm>:
- Найти минимальный элемент:
std::min_element - Развернуть последовательность:
std::reverse
std::reverse(std::min_element(vect.begin(), vect.end()), vect.end());
Пример программы (online):
#include <algorithm>
#include <iostream>
#include <vector>
void print_vector(const std::vector<int> & input)
{
for (const auto i : input)
{
std::cout << i << ' ';
}
std::cout << std::endl;
}
void reverse_vector(std::vector<int> & input)
{
if (input.empty())
{
std::cerr << "vector is empty" << std::endl;
return;
}
std::reverse(std::min_element(input.begin(), input.end()), input.end());
}
int main()
{
std::vector<int> vect {10, 500, 40, 18, 4, 46, 39, 134, 98};
print_vector(vect);
reverse_vector(vect);
print_vector(vect);
}
Автор решения: Zero
→ Ссылка
Проблема была в пои поиске min.Менял содержимое указателя, вместо того, чтобы изменить расположение.
В итоге:
vector<int>::iterator min = vect.begin();
int k = 0;
for (int i=0; i < N; i++)
{
if (vect[i] < *min)
{
min = vect.begin()+ i;//изменили расположение минимального элемента
k = i;
}
}
cout << "min=" << *min << "\n";
for (int i = 0; i <= (N - k)/2; i++)
{
int chng;
chng = *(min + i);
*(min + i) = *(vect.end()-1 - i);
*(vect.end()-1 - i) = chng;
}