【问题标题】:C++ template function check unique vectorC++模板函数检查唯一向量
【发布时间】:2020-05-16 12:37:05
【问题描述】:

我正在尝试编写一个名为unique() 的模板化函数,它仅使用<vector><set><iostream> 标头来检测std::vector 是否只有唯一元素。

template <typename T>
bool unique(const std::vector<T>& container){}

我怎样才能做到这一点?

【问题讨论】:

  • 你尝试了什么?对你来说显而易见的事情对其他人来说根本不明显。你遇到了什么问题?
  • 想想std::set 是如何工作的,添加一些迭代器魔法,解决方案可能是单行的。

标签: c++ templates vector stream boolean


【解决方案1】:

如果您可以使用std::set,这实际上非常简单。由于std::set 将只存储独特的项目,您可以从std::vector 创建一个std::set 并比较它们的大小。如果它们匹配,则向量具有唯一元素。看起来像

template <typename T>
bool unique(const std::vector<T>& container)
{
    return container.size() == std::set<T>{container.begin(), container.end()}.size();
}

【讨论】:

  • 哦,我现在明白了。设置流还是蛮好用的
  • @cppp2020 是的,迭代器对构造函数非常有用。需要注意的是,这是 O(NlogN) 复杂度并且使用 O(N) 空间。效率不高,但效果很好。 std::unordered_set 将其降低到 O(N) 复杂度。
  • 这个问题几乎是重复的。至少答案肯定是:What's the most efficient way to erase duplicates and sort a vector?
  • 请注意,set 要求对象不具有可比性。所以你需要为没有它的 T 提供这个。复制向量、对其进行排序和查找顺序匹配可能会更快。集合做了很多堆分配。
【解决方案2】:
std::set<T> other{ container.begin(), container.end() );
return other.size() < container.size();

你也可以提前爆发。

std::set<T> other;
for (auto&& e:container)
  if (!other.insert( e ).second)
    return false;
return true;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2013-03-13
    • 2013-09-29
    • 2020-10-26
    相关资源
    最近更新 更多