我想知道我是否仍然可以根据unordered_set
上shared_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
答案 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
拥有它。