c++ - 如何让 C++ 中的集合过滤掉指向相同值的不同指针

标签 c++ pointers set

正如我们所知,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 循环迭代检查集合后插入,我还有什么方法可以做我上面提到的吗?

再次感谢!

最佳答案

这是通过使用 std::set 完成的使用自定义比较器比较每个指针指向的值。 std::set具有第二个可选模板参数,用于指定用于比较集合中的值的自定义类。通常是 std::less ,即 < 的精美外观运算符(operator)。基本上,只需指定一个自定义比较器来定义 < 是什么表示您集合中的值。

#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;
}

关于c++ - 如何让 C++ 中的集合过滤掉指向相同值的不同指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57748421/

相关文章:

c++ - 静态内联函数中的局部函数静态对象不共享

c - 在 Swift 中释放 C-malloc() 的内存?

c++ - 我可以使用 '->' 运算符通过指针访问对象指针吗?

c++ - 为什么虚幻引擎中的变量为空?

c++ - 我如何找到部分单词匹配/查找 C++

C++ VirtualProtect PAGE_NOACCESS 导致崩溃

c++ - 在C/C++项目中查看 "include"树

c++ - 不明确的转换为引用

java - 在需要唯一元素和按索引访问时设置 vs 列表

Ruby 在哈希中插入键值元素