Сравнение индексов в stl <vector>

66
04 января 2021, 12:00

Мне нужно от минимального элемента вектора до максимального поменять знаки элементов на противоположные.

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?

Answer 1
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 << ' ';

Теперь ответ на вопросы в комментариях:

  1. Во втором варианте применяем алгоритм for_each, а этот алгоритм применяет функцию к каждому элементу последовательности (просто выполняет element = -element). Если возвращать из функции значение, это значение не будет использовано, и будет безсмыссленное использование памяти. Есть другие алгоритмы(например transform), которые используют именно возвращаемое значение, но это не тот случай.
  2. std::min(pmin, pmax) возвратит pmin или pmax, в зависимости от того, какой элемент встречается раньше_ (минимальный или максимальный), и начинаем со следующего элемента(этот элемент пропускаем) применять функцию к элементам до std::max(pmin, pmax), поэтому к итератору std::min(pmin, pmax) применяем operator+(1).
  3. Мы не исключаем, что индекс максимального может быть первее минимального, мы просто имеем два итератора, указывающие на элементы. Мы просто пишем программу так, чтобы первым итератором был именно тот, который содержит адрес элемента, который первее(не важно какой из них будет).

Для получения ответа на последный вопрос, лучше читайте про цикл по коллекции

READ ALSO
c++: нулевое значение std::chrono::time_point&lt;std::chrono::system_clock&gt;

c++: нулевое значение std::chrono::time_point<std::chrono::system_clock>

Подскажите как можно выставить пустое/нулевое значение для типа

107
Как подключить llvm к проекту visual studio 2017?

Как подключить llvm к проекту visual studio 2017?

Выходят ошибки вроде "class "llvm::Attribute" не содержит члена "ArgMemOnly", "не удаётся открыть источник файл llvm/IR/Intrinsicsgen" и похожие

110
Не применяются стили CSS к ссылкам в HTML

Не применяются стили CSS к ссылкам в HTML

В файле stylecss есть стиль для дива themes (

82