首页 > 解决方案 > 如何让 C++ 中的集合过滤掉指向相同值的不同指针

问题描述

众所周知,C++“set”不允许插入相同的值。

我的问题是,如何将其应用于一堆指针,其中一些指针将指向相同的值。让我们继续下面的例子

set<int *> my_set;
int a = 10, b = 20, c = 10;
int *ptr1 = &a, *ptr2 = &b, *ptr3 = &c;
my_set.insert(ptr1);  // Insert successfully
my_set.insert(ptr2);  // Insert successfully
my_set.insert(ptr3);  // Although insert successfully, 
                      // BUT I DON'T WANT ptr3 TO BE INSERTED,
                      // since it points to the same value as ptr1 does

除了逐个检查包含的值,比如在通过 for 循环迭代检查集合之后插入,还有什么方法可以让我做我上面提到的事情吗?

再次感谢!

标签: c++pointersset

解决方案


这是通过将 astd::set与自定义比较器一起使用来完成的,该比较器比较每个指针指向的值。std::set有第二个可选模板参数,它指定一个自定义类,用于比较集合中的值。通常它是std::less,即,对于<操作员来说是一个花哨的外观。基本上,只需指定一个自定义比较器来定义<集合中值的含义。

#include <iostream>
#include <set>

struct comparator {

    bool operator()(int * const &a,
            int * const &b) const
    {
        return *a < *b;
    }
};

int main()
{
    std::set<int *, comparator> my_set;

    int a = 10, b = 20, c = 10;
    int *ptr1 = &a, *ptr2 = &b, *ptr3 = &c;
    my_set.insert(ptr1);
    my_set.insert(ptr2);
    my_set.insert(ptr3);

    for (const auto &p: my_set)
    {
        std::cout << *p << std::endl;
    }

    return 0;
}

推荐阅读