C++11 如何使用基于另一个向量的谓词删除向量的元素

C++11 如何使用基于另一个向量的谓词删除向量的元素,c++11,vector,stl,erase,C++11,Vector,Stl,Erase,我有两个向量 std::vector<Mat> images; std::vector<std::string> image_paths; 但现在我想删除图像路径上的相同索引。这当然可以推广到任意类型或任意谓词的向量。我怎样才能最优雅地做到这一点呢?也许是这样的: std::erase(std::remove_if(image_paths.begin(), image_paths.end(), [&](const std::string& path)

我有两个向量

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

但现在我想删除图像路径上的相同索引。这当然可以推广到任意类型或任意谓词的向量。我怎样才能最优雅地做到这一点呢?

也许是这样的:

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

您可以创建一个包含两个元素的结构,
Mat
string
(以及需要保存在一起的任何其他字段),并具有这些结构的向量;我考虑过这一点,但对于大多数进一步的处理,我需要对任一向量进行单独的访问,并且不希望两个字段紧密耦合。在这种情况下,这使我的生活更轻松,但随后我不得不改变所有其他接口,要么获取耦合数据向量,要么编写代码来提取奇异分量向量,这似乎也有点不切实际和低效。
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());