Алгоритм поиска C ++: Как мне найти последнее вхождение элемента? - PullRequest
0 голосов
/ 20 октября 2019

Я хотел бы найти последний элемент массива, который удовлетворяет заданному условию. В ответ я хотел бы либо:

  1. Итератор, чтобы я мог использовать std :: distance для нахождения расстояния между этим итератором и началом вектора, либо

  2. Непосредственно вернуть позицию указанного элемента.

В общем, я пытаюсь решить это : (i) Найдите максимальный элемент в векторе (max_element) и (ii) найдите first вхождение 0 перед этим max элементом.

Так в следующем примере:

{0, 10, 20, 0, 5, 50, 0, 70, 10, 0} 
// Get max at position 7, return 0 at position 6

После использования max_element из заголовка алгоритма я попробовал что-то вроде приведенного ниже фрагмента кода с использованием обратных итераторов.

auto Itr1 = std::max_element(vect.begin(), vect.end());
auto Itr2 = std::find(Itr1, vect.rend(), [](int i){return i == 0;});

Смешивание обратных и прямых итераторов не было забавным и не работало. Кажется, должно быть более элегантное решение.

Ответы [ 3 ]

1 голос
/ 20 октября 2019

Вы можете использовать make_reverse_iterator(), определенный в заголовке <iterator>. Также обратите внимание, что третий аргумент, который принимает find(), это значение, которое нужно найти.

    std::vector<int> A{ 0, 10, 20, 0, 5, 50, 0, 70, 10, 0 };
    auto itr1 = std::max_element(A.begin(), A.end());
    auto itr2 = std::find(std::make_reverse_iterator(itr1), A.rend(), 0);

1 голос
/ 20 октября 2019

Это работает, хотя и не очень элегантно, требует другого вектора, в котором есть только 0:

std::vector<int> v1 { 0, 10, 20, 0, 5, 50, 0, 70, 10, 0 };
std::vector<int> v2 { 0 };

auto Itr1 = std::max_element(v1.begin(), v1.end());
auto Itr2 = std::find_end(v1.begin(), Itr1, v2.begin(), v2.end());
0 голосов
/ 20 октября 2019

Сначала ошиблись, я думаю, вы ищете reverse_iterator

int main()
{

  std::vector<int> vect{0, 10, 20, 0, 5, 50, 0, 70, 10, 0};
  auto Itr1 = std::max_element(vect.begin(), vect.end());
  auto Itr2 = find_if(std::make_reverse_iterator(Itr1), vect.rend(), [](int i){return i == 0;});

  std::cout<< vect.rend() - Itr2 - 1<<std::endl;
  return 0;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...