集合是否可能包含两个指向同一对象的共享指针?

时间:2011-10-05 10:07:14

标签: c++ set shared-ptr

在我的代码中,我有两个向量:

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的共享指针,我在两个独立的循环中插入珠子;第一个过了一些盒子并插入cBeads集合中任何已更换豆子的珠子,另一个遍布所有离子并插入它们。

我知道共享指针应该是指针或其他东西,这是否意味着我可以放置两个共享指针,指向一组中的同一个对象?

我希望这对你有意义。

4 个答案:

答案 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。

希望这个帮助