2011-10-05 60 views
3

在我的代码,我有两个向量:集合是否可能包含两个指向同一对象的共享指针?

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); 
} 

其中chargebead的整数属性。 我也有一个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共享指针和I插入到它珠两个单独的环;第一个通过一些盒子,并插入到设置有豆变化的任何珠子,另一个遍历所有离子并插入它们。

我知道共享指针应该是指针的所有者,这是否意味着我可以放置两个共享指针,指向集合中的同一个对象?

我希望这对你有意义。

+1

共享指针是资源的*共享*所有者。任何数量的共享指针可以共享相同的资源。只有当没有人离开时,资源才会被释放。 (难道这个问题真的要这么长的时间这么简单的点睛之笔?) –

+0

的问题是,不是多个共享指针是否指的是同一个资源,它是多个共享指针指的同一资源是否可以被存储在'STD :: set'。 –

回答

3

不,这是不可能的。

std::set保证它包含没有重复。实例是否与另一个实例重复是通过应用第二个模板参数决定的,该参数默认为std::less

标准库提供了一个operator <,它在std::shared_ptr上运行,对基础指针执行少于比较。

3

什么是您正在使用的比较功能?如果它是默认值(std::less),那么在std::set中不能有两个指向同一对象的指针;对于这个问题,我想不出一个符合要求的可能的比较函数,并且会允许它。

+0

我想我们可以想像,比较能以某种方式包括删除器。这将被打破,以创建两个'shared_ptr'与不同的删除器相同的资源,但是这是用户的问题,而不是设定的。 –

0

一般来说,想共享的指针,如果它是一个标准的指针,因为这通常是(我通常会说是保守的)共享指针类背后的目标。

此外,共享指针背后的概念是绝对不关于作为一个标准的指针,但相反的,即,“所有者”:共享在多个参与者的所有权。

两个不同的共享指针实例(与内部的相同指针对象)应(将)比较相等,任何其他行为将是极其计数器直观。

如果使用的std ::设置的是限制独特的条目,那么它应该达到预期效果,但如果你希望重复,你需要像一个std ::向量另一个容器。

希望这个帮助

相关问题