C++/STL 我应该使用哪种算法来检查容器是否有重复项?

标签 c++ stl

是否有任何 STL 算法可以判断容器是否具有重复元素(使用 operator== 或给定谓词)?

让我们考虑这两个 vector :

std::vector<int> v1{ 1, 2, 3 };
std::vector<int> v2{ 1, 2, 1 };

我希望有这样的功能:

std::is_exclusive( v1.begin(), v1.end() ); // returning true
std::is_exclusive( v2.begin(), v2.end() ); // returning false

有这么简单的功能吗?我找不到任何(找到 std::unique ,但这会修改​​ vector ...)

注意:我不是在问如何“检查容器是否有重复项”,我知道我该怎么做(基本上,我可以做 ( std::set<int>( v1.begin(), v1.end() ).size() == v1.size() ) 并且可能存在许多其他选项。我在问是否有一个 STL 算法函数可以以更智能的方式完成它,因为我很惊讶我找不到任何...

最佳答案

实现类似 STL 的 is_exclusive 模板函数的一种方法是使用 std::unordered_map 来保持范围内元素的计数。只要任何元素的计数超过 1,函数模板就会返回 false:

#include <unordered_map>

template<typename ForwardIt>
bool is_exclusive(ForwardIt first, ForwardIt last) {
    std::unordered_map<typename ForwardIt::value_type, unsigned> count;

    for (auto it = first; it != last; ++it)
        if (++count[*it] > 1)
            return false;

    return true;
}

以你的例子为例:

int main() {
    std::vector<int> v1{ 1, 2, 3 };
    std::vector<int> v2{ 1, 2, 1 };


    assert(is_exclusive(v1.begin(), v1.end()));
    assert(!is_exclusive(v2.begin(), v2.end()));
}

关于C++/STL 我应该使用哪种算法来检查容器是否有重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51964230/

相关文章:

c++ - 是否可以使用基类构造函数使用派生类将值初始化为基类私有(private)成员?

c++ - 生成加起来为 1 的随机数字列表

c++ - 如何从另一张 map 构建一张 map ?

c++ - std::set 和 std::vector 有什么区别?

c++ - 将 "new"与initializer_list一起使用不会分配字符串值,而 int 值可以工作

c++ - 如何使用包含内部类的类的实例有效地访问内部类的成员?

c++ - 访问冲突读取位置 0xcdcdcdcd。 C++

c++ - Seek 不适用于使用 boost filtering_istreambuf 初始化的 std::istream

c++ - C++ 中的私有(private)运算符删除

c++ - STL 中的 hash<char*> 函数是否给出 char* 和 size_t 之间的 1-1 映射?