对象中的vector中的Push_back

push_back in a vector in a object

本文关键字:Push back 中的 vector 对象      更新时间:2023-10-16

我有一个带有这个属性的教授类

vector<int> hDisponibles;

如果我有这个类的向量

set<profesor> profesores;

I try this

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

std::set只提供const迭代器,因为当对象在集合中时修改它们会破坏集合不变性。因此,您不能对std::set做您想做的事情,您需要读取新对象,或者使用不同的容器。

您的问题是您试图呼叫push_backvectorconst。这是因为(从c++ 11开始)std::set的元素是通过const_iterators访问的,因为改变它们可能会改变它们的比较方式,从而破坏set。要解决这个问题,您有两个选项:

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

你的代码有一个额外的错误,因为hdisponsibles是一个对象,但push_back被调用,如果它是一个指针。从你的编译器消息,它似乎不像bug是在你的实际代码,但以防万一,它应该是:

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

Edit:找到标准草案中的部分(值类型与setmultiset的关键字相同:N3290§23.2.4/6

关联容器的

迭代器是双向迭代器类别。对于值类型相同的关联容器作为键类型,iterator和const_iterator都是常量迭代器。是否为iterator和const_iterator未指定是同一类型的。[注:iterator和const_iterator具有相同的语义,迭代器可转换为const_iterator。用户可以通过始终使用来避免违反一个定义规则在函数形参列表中使用Const_iterator。尾注)

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

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

但我有一种感觉,有更多的错误与语法有关的地方。

请发布更完整的代码摘要和您得到的错误。