std :: unordered_set insert获取对象

时间:2014-09-26 21:56:30

标签: c++ c++11

我在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;?

如何获取刚刚插入的对象的引用?

2 个答案:

答案 0 :(得分:3)

unordered_set的成员必须是const,以便他们的哈希值不会发生变化 - 这会破坏基础数据结构。迭代器在const元素的类型中强制执行first

答案 1 :(得分:0)

要修复编译器错误,请更改行

    return std::make_shared<Policy>( *res.first );

    return std::make_shared<Policy>( *(*res.first) );

*res.firstshared_ptr*(*res.first)是对基础Policy对象的引用。