1

我有一个具有此属性的教授课程

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
4

3 回答 3

4

std::set仅提供 const 迭代器,因为在集合中修改对象会破坏集合不变性。所以,你不能做你想做的事std::set,你需要读取新对象,或者使用不同的容器。

于 2012-01-03T22:28:33.983 回答
3

您的问题是vector您试图调用push_back的是const. 这是因为(自 C++11 起)a 的元素std::set是通过 访问的const_iterators,因为更改它们可能会改变它们的比较方式并因此破坏set. 要解决这个问题,您有两个选择:

  1. 如果hDisponiblesprofesor比较方式没有影响并且不会对您的整体结构造成太大损害,您可以mutable像这样声明它:mutable vector<int> hDisponibles;. mutable即使成员所在的结构是const
  2. 我这不是一个选项,你必须profesor从集合中删除(到临时的),做你的push_back并重新插入它(小心迭代器失效)。当然,这是相当昂贵的。

您发布的代码有一个额外的错误,因为hdisponsibles它是一个对象,但push_back就像它是一个指针一样被调用。从您的编译器消息看来,该错误似乎不在您的实际代码中,但以防万一:

(*itP).hDisponibles.push_back(0);    

编辑:set在标准草案中找到该部分(值类型与和的键相同multiset:N3290 §23.2.4/6

关联容器的迭代器属于双向迭代器类别。对于值类型与键类型相同的关联容器,iterator 和 const_iterator 都是常量迭代器。未指定 iterator 和 const_iterator 是否为同一类型。[注:在这种情况下,iterator 和 const_iterator 具有相同的语义,并且 iterator 可以转换为 const_iterator。用户可以通过始终在其函数参数列表中使用 const_iterator 来避免违反单一定义规则。——尾注]

于 2012-01-03T22:37:33.227 回答
1

您的代码的明显错误是您正在使用->而不是.在这一行:

(*itP).hDisponibles->push_back(0);  // should be itP->hDisponibles.push_back(0);

但我感觉在某处有更多与语法相关的错误。请发布更完整的代码摘要和您遇到的错误。

于 2012-01-03T22:28:09.943 回答