Мне нужно от минимального элемента вектора до максимального поменять знаки элементов на противоположные.
auto max = *max_element(v.begin(), v.end());
cout << "Максимум " << max << endl;
auto max = *min_element(v.begin(), v.end());
cout << "Минимум" << max << endl;
Дальше я хотела сравнить индексы этих элементов и сделать swap, если индекс максимального больше чем минимального. А дальше сделать цикл while (min!= max) arr*=-1 Был с вариантом for_each, но я не знаю как запихнуть в 3 параметр само действие.
В общем-то вопрос, как можно найти индексы этих элементов? Есть ли такая функция в STL?
auto p = std::minmax_element(v.begin(), v.end());
std::cout << "positions:\nmin - "
<< std::distance(v.begin(), p.first) << '\n'
<< "max - " << std::distance(v.begin(), p.second);
или
std::cout << "positions:\nmin - "
<< p.first - v.begin() << '\n'
<< "max - " << p.second - v.begin();
Обновление:
это ответ на тот часть вопроса, где вы спрашиваете как получить индексы. Но в комментариях я понел, что вам нужно сделать это:
auto pmin = min_element(v.begin(), v.end()),
pmax = max_element(v.begin(), v.end());
//вариант первый
if (pmin > pmax) //вы сравнивали неправильно
swap(pmin, pmax);
while (++pmin != pmax)
*pmin *= -1;
// вариант второй (в лямбде ничего не нужно возвращать)
for_each(std::min(pmin, pmax) + 1, std::max(pmin, pmax),
[](int& i) { i = -i; });
можете смотреть результат:
for (int i : v)
cout << i << ' ';
Теперь ответ на вопросы в комментариях:
for_each
, а этот алгоритм применяет функцию к каждому
элементу последовательности (просто выполняет element = -element).
Если возвращать из функции значение, это значение не будет
использовано, и будет безсмыссленное использование памяти. Есть
другие алгоритмы(например transform), которые используют именно
возвращаемое значение, но это не тот случай.pmin
или pmax
, в зависимости от
того, какой элемент встречается раньше_ (минимальный или
максимальный), и начинаем со следующего элемента(этот элемент
пропускаем) применять функцию к элементам до std::max(pmin, pmax)
,
поэтому к итератору std::min(pmin, pmax)
применяем operator+(1)
.Для получения ответа на последный вопрос, лучше читайте про цикл по коллекции
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Подскажите как можно выставить пустое/нулевое значение для типа
Выходят ошибки вроде "class "llvm::Attribute" не содержит члена "ArgMemOnly", "не удаётся открыть источник файл llvm/IR/Intrinsicsgen" и похожие