c++ - 如何让 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 循环迭代检查集合之后插入,还有什么方法可以让我做我上面提到的事情吗?
再次感谢!
解决方案
这是通过将 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;
}
推荐阅读
- git - 检查存储库的最后一次提交而不克隆它
- javascript - PhpStorm 剪贴板 API
- c# - 提交 devexpress 后隐藏参数面板
- python-3.x - 如何使用 python 将数据写入或附加到 s3 存储桶中已经存在的文件中?
- java - 如何使用 Selenium WebDriver 中的日期选择器选择特定日期
- python - 在 Python 中从 JSON 字符串中提取数据时出错(使用 Redshift)
- python - python:涉及幂级数问题的效率
- android - 如何在 TextWatcher 中关闭 AlertDialog
- javascript - 传单创建瓷砖
- excel - Excel - 清理财务数据集以仅包含最新交易