在我的代码中,我有两个向量:
vector<lipid*> lipids;
vector<shared_ptr<bead> > ions;
lipid
类:
class lipid{
public:
lipid();
lipid(double x, double y, bool up, int LID);
~lipid();
void makeMe(int LID);
std::tr1::shared_ptr<bead> head;
std::tr1::shared_ptr<bead> body;
std::tr1::shared_ptr<bead> tail;
int LID;
vec direction;
};
我在脂质的构建体中产生头部,身体,尾珠。
std::tr1::shared_ptr<bead> he(new bead);
std::tr1::shared_ptr<bead> bo(new bead);
std::tr1::shared_ptr<bead> ta(new bead);
this->head = he;
this->body = bo;
this->tail = ta;
一些脂质头通过以下方式插入离子载体:
vector<lipid*>::iterator lit = lipids.begin();
while (lit != lipids.end()){
lipid * l = *lit++;
if (l->head->charge != 0) this->ions.push_back(l->head);
}
其中charge
是bead
的整数属性。
我还有map<vector<int>, set<shared_ptr<bead> > >
来存储一些名为盒子的珠子。要在我使用的任何地图值中添加bead
:
bead b = l->head; //b white also be accessed through a beads vector that holds a shared pointer to all beads in the simulation
vector<int> t = b->getBox(); //a function that returns a valid box
boxes[t].insert(b);
在一个特定的部分,我有一组名为cBeads
的共享指针,我在两个独立的循环中插入珠子;第一个过了一些盒子并插入cBeads
集合中任何已更换豆子的珠子,另一个遍布所有离子并插入它们。
我知道共享指针应该是指针或其他东西,这是否意味着我可以放置两个共享指针,指向一组中的同一个对象?
我希望这对你有意义。
答案 0 :(得分:3)
您使用的比较功能是什么?如果它是默认值(std::less
),那么你不能在std::set
中有两个指向同一对象的指针;就此而言,我无法想到一个符合要求的可能的比较函数,并允许它。
答案 1 :(得分:3)
咨询http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/shared_ptr.htm#comparison(或TR1,或C ++ 11标准)。
如果两个shared_ptr
指向同一个对象,那么它们会在operator<
下进行比较,因此就std::set<shared_ptr<bead> >
而言它们是重复的。
答案 2 :(得分:3)
不,这是不可能的。
std::set
保证它不包含重复项。实例是否与另一个实例重复是通过应用第二个模板参数来决定的,该参数默认为std::less
。
标准库提供了一个operator <
,它在std::shared_ptr
上运行,对底层指针的执行次数不足。
答案 3 :(得分:0)
通常,将共享指针视为标准指针,因为这通常(我通常说是保守的)共享指针类的目标。
此外,共享指针背后的概念绝对不是关于标准指针的“所有者”,而是相反的,即:在多个参与者之间共享所有权。
两个不同的共享指针实例(内部具有相同的指针)应该(将)比较相等,任何其他行为将非常反直觉。
如果使用std :: set限制为唯一条目,那么它应该按预期执行,但是如果你期望重复,你将需要另一个容器,如std :: vector。
希望这个帮助