C++ C++;:在指针集中查找

C++ C++;:在指针集中查找,c++,pointers,stl,constants,C++,Pointers,Stl,Constants,下面的例子说明了我的问题: #include <set> class A {}; int main() { A a; A * p = &a; const A * cp = &a; std::set<A*> s; s.insert(p); s.find(cp); } #包括 A类{}; int main() { A A; A*p=&A; 常数A*cp=&A; std::集s; s、 插入(p); s、

下面的例子说明了我的问题:

#include <set>

class A {};

int main()
{
    A a;
    A * p = &a;
    const A * cp = &a;

    std::set<A*> s;
    s.insert(p);
    s.find(cp);
}
#包括
A类{};
int main()
{
A A;
A*p=&A;
常数A*cp=&A;
std::集s;
s、 插入(p);
s、 find(cp);
}
汇编结束于:

a.cpp: In function ‘int main()’:
a.cpp:13:18: error: invalid conversion from ‘const A*’ to ‘std::set<A*>::key_type {aka A*}’ [-fpermissive]
         s.find(cp);
                  ^
In file included from /usr/include/c++/4.9.1/set:61:0,
                 from a.cpp:1:
/usr/include/c++/4.9.1/bits/stl_set.h:701:7: note: initializing argument 1 of ‘std::set<_Key, _Compare, _Alloc>::iterator std::set<_Key, _Compare, _Alloc>::find(const key_type&) [with _Key = A*; _Compare = std::less<A*>; _Alloc = std::allocator<A*>; std::set<_Key, _Compare, _Alloc>::iterator = std::_Rb_tree_const_iterator<A*>; std::set<_Key, _Compare, _Alloc>::key_type = A*]’
       find(const key_type& __x)
a.cpp:在函数“int main()”中:
a、 cpp:13:18:错误:从“const a*”到“std::set::key_type{aka a*}”[-fppermissive]的转换无效
s、 find(cp);
^
在/usr/include/c++/4.9.1/set:61:0中包含的文件中,
来自a.cpp:1:
/usr/include/c++/4.9.1/bits/stl_set.h:701:7:注意:初始化'std::set::iterator std::set::find(const key_type&)[with _key=A*;_Compare=std::less;_Alloc=std::分配器;std::set::iterator=std:_Rb_tree_const_iterator;std::set::key_type=A*]
查找(常量键类型和x)

我知道它为什么不编译,但有没有比
s.find((A*)cp)
更丑陋、更残酷的解决方案?set和const指针都给出了。

不幸的是,
set
的查询方法没有在键类型上模板化(它们确实应该是),因此
下限
相等范围
等都没有帮助

假设变量类型不可协商,您唯一的选择是丢弃指针的常量,或者
将集合重新解释为
集合
。后者在某些方面让我感觉更好,但在技术上是不安全的


扔掉警察。使用
const_cast
来做这件事,明确这是演员们唯一要做的事情。如果你喜欢,把它和find包装在一个free函数中;如果一段代码是邪恶的,那么最好将邪恶的东西作为它唯一能做的事情。

你可以将“发现”与const_cast结合使用:

s.find(const_cast<A*>(cp));
s.find(const_cast(cp));
一个选项是将C++14与以下组件一起使用:


std::set。(在clang/libc++和Visual Studio的下一个版本中提供)如果没有它,你几乎被
const\u cast
'ing
cp

卡住了,正在将集合的类型更改为
set
一个选项?
但是有没有比这更丑陋和残酷的解决方案呢
没有一组指针。
const a*
a*
不同@Paul McKenzie一组智能指针不会更好。在
find
中,您正在搜索一个
const
元素,但是该集合被声明为具有非const元素。嗯,您已经快了半分钟。我浏览了github的草稿,并使用责怪来查找那些文档编号。@dyp我作弊并使用了libstdc++状态页面:)好吧,我至少可以将我的实时示例粘贴到这里(并从OP中删除我的评论)。(“我只是证明了它是编译的,没有尝试过”)Boost多索引容器已经有很长时间的异构查找了。我希望Boost.Container有更多这样的功能,但当时没有。”不幸的是,set的查询方法并没有按照键类型模板化(它们确实应该是这样的),“这有其优点和缺点。我记得有一个bug是由这种异构查找成员函数与同构比较函数(每次比较都会导致转换)组合而成的。见T.C.的答案。
std::set<A*, std::less<>> s;
s.find(cp);