push_back在对象中的向量中

时间:2012-01-03 22:24:15

标签: c++ vector iterator push-back

我有一个具有此属性的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

3 个答案:

答案 0 :(得分:4)

std::set只提供const迭代器,因为在对象中修改对象会破坏set不变量。因此,您无法使用std::set执行所需操作,您需要读取新对象或使用其他容器。

答案 1 :(得分:3)

您的问题是,vector您尝试拨打的push_backconst。这是因为(从C ++ 11开始)std::set的元素是通过const_iterators访问的,因为更改它们可能会改变它们的比较方式,从而破坏set。要解决这个问题,您有两种选择:

  1. 如果hDisponiblesprofesor的比较方式没有影响,并且不会对您的整体结构造成太大损害,您可以将mutable声明为mutable vector<int> hDisponibles;mutableconst成员即使其所在的结构为profesor
  2. 也可以更改
  3. 我不是一个选项,你必须从集合中删除push_back(进入临时),执行你的hdisponsibles并重新插入它(注意迭代器失效)。当然这是非常昂贵的。
  4. 您发布的代码有一个额外的错误,因为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);

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