Как удалить элементы вектора с предикатом на основе другого вектора - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть два вектора

std::vector<Mat> images;
std::vector<std::string> image_paths;

и я хотел бы отфильтровать индексы в обоих векторах, где изображение пусто.Это легко сделать для одного вектора:

std::remove_if(images.begin() images.end(), [](const Mat& img) { return img.empty(); });

Но теперь я бы хотел удалить те же самые индексы для image_paths.Это, конечно, может быть обобщено на векторы произвольных типов или произвольных предикатов.Как я могу сделать это наиболее элегантно?

1 Ответ

0 голосов
/ 28 февраля 2019

Возможно, что-то вроде этого:

std::erase(std::remove_if(image_paths.begin(), image_paths.end(),
  [&](const std::string& path) {
    auto index = &path - &image_paths.front();
    return images[index].empty();
  }), image_paths.end());

std::erase(std::remove_if(images.begin(), images.end(),
  [](const Mat& img) { return img.empty(); }), images.end());

Работает только для std::vector, где гарантировано плоское хранилище.

...