请跟我说,这是我第一次发帖。我有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)++;
}
答案 0 :(得分:2)
问题是set
已排序。如果允许通过迭代器更改元素,那么它基本上意味着您可能使迭代器无效,因此,自C ++ 11起,set
的{{3}}就是常量双向迭代器,因此具有与集合const_iterator
相同的语义。
解决方案虽然有点难看,但是要删除,修改和重新插入元素。有一项建议允许修改关联容器的密钥,但我不知道是否有任何进展标准化的进展。