gpt4 book ai didi

c++ - 删除 N 维 vector 的重复成员

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:22 25 4
gpt4 key购买 nike

递归模板对我来说仍然很困惑,我觉得我没有像我应该的那样使用它们。例如,我尝试使用递归模板编写一个函数来删除 n 维 vector 的所有重复成员,并且我相信我有一些有效的代码。但是,我几乎相信有更好的方法可以做到这一点:

  template <typename T>
void remove_if_duplicate(std::vector<T>& vec, bool at_end)
{
static std::set<T> seen;
if(!at_end)
{
auto newEnd = std::remove_if(vec.begin(), vec.end(), [=](const T& value)
{
if(seen.find(value) != std::end(seen))
return true;

seen.insert(value);
return false;
});
vec.erase(newEnd, vec.end());
std::cout << "\n\nhere: " << at_end << "\n\n";
}
if(at_end) {seen.clear();}
}

template <typename T>
void remove_if_duplicate(std::vector<std::vector<T>>& v, bool at_end)
{
if(!at_end)
{
for(unsigned int i = 0; i < v.size(); i++)
{
remove_if_duplicate(v[i], at_end);
}
}
if(at_end) {remove_if_duplicate(v[0], at_end);}
}

template <typename T>
void remove_duplicates(std::vector<std::vector<T>>& v)
{
remove_if_duplicate(v, false);
remove_if_duplicate(v, true);
}

请在此处查看示例:http://coliru.stacked-crooked.com/a/6e11f9ababcdfa12

请注意我如何将设置变量“seen”声明为基本函数的静态变量。我这样做是为了即使在遍历多维 vector 时我仍然可以访问之前“看到”的项目。我无法在第二个函数内声明“已见”变量,因为此时模板化多维 vector 的基本类型是未知的(然后一维 vector 的情况也不起作用)。因此,我必须将 bool 值传递给这些函数,以便决定何时真正清除静态设置变量,以便我可以再次将此函数用于其他 n 维 vector 。

虽然到目前为止它似乎有效并且给了我想要的行为,但我不确定是否会因为我的实现不当而出现任何意想不到的错误。我认为我在这里做这件事的方式远非理想,而且我确信有更好、更有效的方式。 你会怎么做?

最佳答案

您可以通过使用辅助类构造正确的 set 来摆脱静态:

template <typename T> struct inner_type
{
using type = T;
};

template <typename T> struct inner_type<std::vector<T>>
{
using type = typename inner_type<T>::type;
};

然后你可以这样做:

template <typename T>
void RemoveDuplicatesImpl(std::vector<T>& v,
std::set<T>& values)
{
v.erase(std::remove_if(v.begin(), v.end(), [&](const T& t)
{
return !values.insert(t).second;
}), v.end());
}

template <typename T>
void RemoveDuplicatesImpl(std::vector<std::vector<T>>& v,
std::set<typename inner_type<T>::type>& values)
{
for (auto& inner : v) {
RemoveDuplicatesImpl(inner, values);
}
}

template <typename T>
void RemoveDuplicates(std::vector<T>& v)
{
std::set<typename inner_type<T>::type> values;
RemoveDuplicatesImpl(v, values);
}

关于c++ - 删除 N 维 vector 的重复成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45394902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com