【问题标题】:How to remove elements of a vector with a predicate based on another vector如何使用基于另一个向量的谓词删除向量的元素
【发布时间】:2019-02-27 18:15:35
【问题描述】:

我有两个向量

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 上的相同索引。这当然可以推广到任意类型或任意谓词的向量。我怎样才能最优雅地做到这一点?

【问题讨论】:

  • 您可以创建一个包含两个元素的结构,Matstring(以及您需要保持在一起的任何其他字段),并拥有这些结构的向量;而不是试图让两个独立的向量保持同步。
  • 我已经考虑过了,但是对于大多数进一步的处理,我需要单独访问任一向量并且不想紧密耦合两个字段。在这种情况下,它让我的生活更轻松,但我必须更改所有其他接口以获取耦合数据向量或编写代码来提取奇异分量向量,这似乎也有点不切实际和低效。

标签: c++11 vector stl erase


【解决方案1】:

可能是这样的:

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,保证平面存储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    相关资源
    最近更新 更多