我有两个相关的向量。向量具有相同的大小,并且在可以将其重构为某个结构的单个向量的意义上,它们的内容与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不起作用?
答案 0 :(得分:0)
您遇到的问题是您无法sort
或以其他方式修改view
。如果仅创建成对的向量,则可以使用sort
和unique
而不会遇到任何麻烦:
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。