我有一个具有此属性的profesor类
vector<int> hDisponibles;
如果我有这个类的向量
set<profesor> profesores;
我试试这个
set<profesor>::iterator itP;
itP = profesores.begin();
while ( itP != profesores.end() ){
(*itP).hDisponibles->push_back(0);
itP++;
}
但是这个错误
utils.cpp:138: error: passing ‘const std::vector<int, std::allocator<int> >’ as ‘this’ argument of ‘void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = int, _Alloc = std::allocator<int>]’ discards qualifiers
答案 0 :(得分:4)
std::set
只提供const迭代器,因为在对象中修改对象会破坏set不变量。因此,您无法使用std::set
执行所需操作,您需要读取新对象或使用其他容器。
答案 1 :(得分:3)
您的问题是,vector
您尝试拨打的push_back
是const
。这是因为(从C ++ 11开始)std::set
的元素是通过const_iterators
访问的,因为更改它们可能会改变它们的比较方式,从而破坏set
。要解决这个问题,您有两种选择:
hDisponibles
对profesor
的比较方式没有影响,并且不会对您的整体结构造成太大损害,您可以将mutable
声明为mutable vector<int> hDisponibles;
:mutable
。 const
成员即使其所在的结构为profesor
push_back
(进入临时),执行你的hdisponsibles
并重新插入它(注意迭代器失效)。当然这是非常昂贵的。您发布的代码有一个额外的错误,因为push_back
是一个对象,但(*itP).hDisponibles.push_back(0);
被调用就好像它是一个指针。从你的编译器消息来看,你的实际代码中似乎没有bug,但以防它应该是:
set
修改:找到标准草稿中的部分(值类型与multiset
和{{1}}的键相同:N3290§23.2.4/ 6 < / p>
关联容器的迭代器是双向迭代器 类别。对于值类型相同的关联容器 作为键类型,iterator和const_iterator都是常量 迭代器。它是否未指定迭代器和const_iterator 是相同的类型。 [注意:iterator和const_iterator完全相同 在这种情况下是语义,迭代器可以转换为const_iterator。 用户可以通过始终使用来避免违反One De fi nition规则 const_iterator在他们的函数参数列表中。 -endnote]
答案 2 :(得分:1)
代码的明显错误是您在此行使用->
而不是.
:
(*itP).hDisponibles->push_back(0); // should be itP->hDisponibles.push_back(0);
但是我觉得在某处有更多与语法相关的错误。请发布更完整的代码摘要和您获得的错误。