如何在C ++

时间:2015-06-02 21:02:34

标签: c++11 vector

请跟我说,这是我第一次发帖。我有3节课。类供应商有一套类父母。 Class Parent具有Class位置的向量,Class location具有数据成员。例如(这是伪代码,而不是我的实际代码。我只是为了简单起见才显示这一点):

Class Suppliers{
set<Parent> setter;
};
Class Parent{
vector<location> loc;
};

`

以下是我创建的位置类的构造函数。我遇到没有问题,直到我用迭代器击中两行。我正在尝试找到一个特定的家长,并将一个新位置推回到家长的位置。向量。所以我通过以前作为参考找到的迭代器。但是一旦我尝试推回我的位置类的新实例,我就会收到以下错误。

data.cpp:139:33:错误:传递&#39; const std :: vector&#39;作为&#39;这个&#39;参数&#39; void std :: vector&lt; _Tp,_Alloc&gt; :: push_back(const value_type&amp;)[with _Tp = location; _Alloc = std :: allocator; std :: vector&lt; _Tp,_Alloc&gt; :: value_type = location]&#39;抛弃限定符[-fpermissive]

最后一行也会出现一条错误,指出我无法更改只读对象。我很困惑为什么这会是一个只读对象。我做了一些研究,并认为我需要添加一个复制构造函数。然而,这导致了比解决更多的问题。有什么想法吗?

location::location(set<Parent>::iterator &it, vector<string> v){ 


 sup_id = v[0];
 address1 = v[2];
 address2 = v[3];
 city = v[4];
 state = v[5];
 country = v[6];
 zip = v[7];
 ((*it).loc).push_back(*this);
 ((*it).num)++;



}

1 个答案:

答案 0 :(得分:2)

问题是set已排序。如果允许通过迭代器更改元素,那么它基本上意味着您可能使迭代器无效,因此,自C ++ 11起,set的{​​{3}}就是常量双向迭代器,因此具有与集合const_iterator相同的语义。

解决方案虽然有点难看,但是要删除,修改和重新插入元素。有一项建议允许修改关联容器的密钥,但我不知道是否有任何进展标准化的进展。