2014-09-26 42 views
0

我在unordered_set中插入一個對象。 我想在插入/之後得到實際的對象拷貝。std :: unordered_set insert獲取對象

#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&’ 

爲什麼我會得到一個const MyClass的&的的std :: _詳細:: _ Node_const_iterator isntead?

如何獲取剛剛插入的對象的引用?

+1

將'_policies' var的設置聲明添加到發佈的問題代碼中。這一點很重要。我有一種感覺,如果你沒有在你的設置中存儲'std :: shared_ptr ',你應該。 (它看起來不像你)。 – WhozCraig 2014-09-26 22:10:18

+0

是R Sahu,對不起,錯字 – 2014-09-26 22:15:47

+0

@WhozCraig不,我不是我正在使用Policy對象。我已經將它更改爲std :: unordered_set >,我沒有收到編譯錯誤。謝謝,謹慎地闡述爲什麼會發生這種情況? – 2014-09-26 22:17:58

回答

3

unordered_set的成員必須是const,以便它們的哈希不會更改 - 這會破壞基礎數據結構。迭代器在first元素的類型中執行const

+0

因此,基本上我不能訪問插入的對象,以避免打破常量? – 2014-09-26 22:24:30

+0

@Alex你可以訪問,但它必須是'const'訪問。您可以以任何方式檢查對象,但不允許更改。 – 2014-09-26 22:25:42

+0

謝謝,這很有道理 – 2014-09-26 22:58:02

0

要修正編譯器錯誤,改變線

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

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

*res.firstshared_ptr*(*res.first)是對基礎Policy對象的引用。