我在unordered_set中插入一个对象。 我希望在插入/之后从集合中获取实际的对象副本。
#include <iostream>
#include <unordered_set>
#include <string>
int main ( void )
{
std::unordered_set<std::string> sentence;
auto res = sentence.insert( "alex" );
if ( res.second )
std::cout << *res.first << std::endl;
return 0;
}
以上简单的例子,工作正常。 当我尝试使用我的自定义类时:
std::unordered_set<Policy> _policies;
...
...
if ( std::shared_ptr<Policy> policy = calculatePolicy ( state, action, 0.f ) )
{
auto res = _policies.insert ( *policy );
if ( res.second )
return std::make_shared<Policy>( *res.first );
我明白了:
no known conversion for argument 1 from ‘std::__detail::_Node_const_iterator<Policy, true, true>’ to ‘const Policy&’
为什么我得到一个std :: _ detail :: _ Node_const_iterator而不是const MyClass&amp;?
如何获取刚刚插入的对象的引用?
答案 0 :(得分:3)
unordered_set
的成员必须是const
,以便他们的哈希值不会发生变化 - 这会破坏基础数据结构。迭代器在const
元素的类型中强制执行first
。
答案 1 :(得分:0)
要修复编译器错误,请更改行
return std::make_shared<Policy>( *res.first );
到
return std::make_shared<Policy>( *(*res.first) );
*res.first
是shared_ptr
。 *(*res.first)
是对基础Policy
对象的引用。