如何从一个键入shared_ptr的unordered_set获取基于raw_ptr的元素

时间:2016-04-22 22:39:39

标签: c++ c++14 shared-ptr unordered-set

我想知道我是否仍然可以根据unordered_setshared_ptr键入unordered_set< shared_ptr<MyObj> > sets; auto myobj = make_shared<MyObj>(); sets.insert(myobj); // Find the element myobj sets.find(myobj); // How to find the element based on the underlying raw pointer? sets.find(my.obj.get()); <---- apparently this gives compile error // This method works but it will double free myobj though (not correct) sets.find(shared_ptr<MyObj>(my.obj.get())); 的原始指针来检索元素。

import numpy as np
import pandas as pd

df1 = pd.DataFrame(np.random.randn(10, 4), columns=['a', 'b', 'c', 'd'])
mask = df1.applymap(lambda x: x <-0.7)
df1 = df1[-mask.any(axis=1)]
sLength = len(df1['a'])


rwno=0
PrevClose=[]
for index,row  in df1.iterrows():
     Close=row.iloc[3]
     PrevClose.append(Close)
     rwno+=1


print df1
rwno=1  
for index,row  in df1.iterrows():
    NxtDaySpy=0
    if rwno < len(df1.index) :   
         NextClose=PrevClose[rwno]
         Close=row.iloc[3]
         df1['e']=pd.Series((NextClose-Close)/abs(NextClose-Close), index=df1.index)

    rwno+=1


print df1.head

2 个答案:

答案 0 :(得分:3)

要使用std :: set with heterogeneous lookup,只需使用底层原始指针即可找到您要查找的内容。

这里需要注意的是,您必须使用集合而不是unordered_set。如果你确实需要无序(我发现很少),那么请使用alexm的shared_from_this()解决方案。否则,异构查找是一种相当优雅和灵活的方法。

-

使用异构查找,您只需要定义一个特殊的比较器,该组将用于其排序函数。

以下应该可以解决问题:

struct Raw_comp{
  using is_transparent = std::true_type;
  bool operator()(const shared_ptr<MyObj>& lhs, const shared_ptr<MyObj>& rhs) const{
   return lhs < rhs;
}
  bool operator()(shared_ptr<MyObj>& lhs, MyObj* rhs) const{
   return std::less<MyObj>()(lhs.get(), rhs);
}
  bool operator()(const MyObj* lhs, const shared_ptr<MyObj>& rhs) const{
   return std::less<MyObj>()(lhs, rhs.get());
}
};

然后声明集合:

set< shared_ptr<myObj>, Raw_cmp> sets;

Here is more information on heterogeneous lookup if you are interested

答案 1 :(得分:-1)

您可以将MyObj声明为:

class MyObj : public std::enable_shared_from_this<MyObj>
{
     ....
}

这会添加一个返回给定对象实例的共享指针的方法。

MyObj * rawptr = myobj.get();
sets.find(rawptr->shared_from_this());

请注意,在对象上调用shared_from_this()之前,必须有std::shared_ptr拥有它。