根据第一个向量上的重复项删除两个向量中的重复项

时间:2020-04-20 22:46:22

标签: c++ range-v3

我有两个相关的向量。向量具有相同的大小,并且在可以将其重构为某个结构的单个向量的意义上,它们的内容与1:1匹配。我正在尝试删除第一个向量上的重复项,而这应该在第二个向量中匹配。

v1 = [5 4 3 7 6 5 2 3]
v2 = [0 1 2 3 4 5 6 7]

由于在v1中重复了5和3,结果应该是

v1 = [5 4 3 7 6 2]
v2 = [0 1 2 3 4 6]

顺序可以更改,只要关系相同即可。

我正在尝试使用range-v3库实现这一目标。

std::vector<unsigned int>  v1;
std::vector<double> v2;

auto v1Andv2 = range::views::zip(v1, v2);
ranges::sort(v1Andv2)
// ranges::unique(v1Andv2) // Doesnt compile
auto lastIt = std::unique(std::begin(v1Andv2), std::end(v1Andv2), [](const auto &a, const auto &b) {
    // Since the second value of the zip is a double and could be slightly different, 
    // I am only interested in first one
    return std::get<0>(a) == std::get<0>(b);
});

v1.erase(???, std::end(v1));
v2.erase(???, std::end(v2));

我不知道应该在???中放置什么?获取迭代器中zip中的每个值。 另外,为什么在这种情况下range :: actions :: unique不起作用?

1 个答案:

答案 0 :(得分:0)

您遇到的问题是您无法sort或以其他方式修改view。如果仅创建成对的向量,则可以使用sortunique而不会遇到任何麻烦:

auto vv = ranges::views::zip(v1, v2) | 
          ranges::to<std::vector<std::pair<int,int>>>;

vv |= ranges::actions::sort([](auto const &a, auto const &b)
                            { return a.first < b.first; })
    | ranges::actions::unique([](auto const &a, auto const &b)
                              { return a.first == b.first; });

这是工作中的demo

您甚至可以通过再次sort重新将其重新排列为原始顺序,如下所示:

vv |= ranges::actions::sort([](auto const &a, auto const &b)
                            { return a.first < b.first; })
   | ranges::actions::unique([](auto const &a, auto const &b)
                             { return a.first == b.first; })
   | ranges::actions::sort([](auto const &a, auto const &b)
                           { return a.second < b.second; });

这里是demo

相关问题