修改容器中没有指针的对象:vector vs set

时间:2017-04-02 22:15:36

标签: c++ vector reference set

我可以访问以下列方式生成对象的工厂:

A a = factory.build();

我想将A类型的对象存储在容器中,访问它们,修改它们的内部状态,然后我通过容器访问该对象我希望像以前一样访问对象(具有修改状态)。 我的第一个想法是在容器中存储指向A的指针。但是,如上所述,工厂不会给我一个指向对象的指针,而是指向对象本身。

A类:

class A
{
  private:
    int id;

  public:
    A(int id)
    {
      this->id = id;
    }

    int getId() const
    {
      return id;
    }

    void setId(int id)
    {
      this->id = id;
    }
};

我发现以下工作使用vector

A obj1(1);

std::vector<A> vec;
vec.push_back(obj1);

A & obj = vec[0];
obj.setId(4);

for(std::vector<A>::iterator itr = vec.begin();itr!=vec.end();itr++)
{
    std::cout << (*itr).getId() << endl;
}

这将打印修改后的id:4。

是否可以使用std::set进行类似的操作?我尝试了以下方法:

struct AComp
{
  bool operator()(const A lhs, const A rhs) const
  {
    return (lhs.getId() < rhs.getId());
  }
};

A obj2(1);

std::set<A, AComp> mySet;
mySet.insert(obj2);

int id = 1;
auto result = std::find_if(mySet.begin(), mySet.end(), [id](A a) {return a.getId() == id;});

A tmp = *result;
tmp.setId(4);
std::cout << tmp.getId() << endl;

for(std::set<A>::iterator itr = mySet.begin(); itr!=mySet.end();itr++)
{
    std::cout << (*itr).getId() << endl;
}

当然这不会改变集合中对象的状态。但在这里我不能说

A & tmp = *result;

这给了我:

binding ‘const hallo2::A’ to reference of type ‘hallo2::A&’ discards qualifiers

如何使用std::set

实现这一目标

2 个答案:

答案 0 :(得分:1)

错误告诉您*resultconst A&,这意味着您不允许通过此引用修改对象。

那是因为你不能修改集合中的对象。如果你真的想要,那么你必须删除并重新插入对象。

答案 1 :(得分:0)

您没有提供工厂类或构建方法,因此我必须假设您指的是标准模式。

但是,如果您只需要一个指向对象的指针,那么应该这样做:

Aptr * A;

Aptr aptr =&amp;(factory.build());