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
'ingcp
卡住了,正在将集合的类型更改为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);