对象中的vector中的Push_back
push_back in a vector in a object
我有一个带有这个属性的教授类
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_back
的vector
是const
。这是因为(从c++ 11开始)std::set
的元素是通过const_iterators
访问的,因为改变它们可能会改变它们的比较方式,从而破坏set
。要解决这个问题,您有两个选项:
- 如果
hDisponibles
对profesor
的比较没有影响,也不会对你的整体结构造成太大的损害,你可以这样声明它为mutable
:mutable vector<int> hDisponibles;
。mutable
成员可以被修改,即使他们所在的结构是const
- 如果这不是一个选项,您必须从集合中删除
profesor
(到临时),执行push_back
并重新插入它(注意迭代器无效)。当然,这是相当昂贵的。
你的代码有一个额外的错误,因为hdisponsibles
是一个对象,但push_back
被调用,如果它是一个指针。从你的编译器消息,它似乎不像bug是在你的实际代码,但以防万一,它应该是:
(*itP).hDisponibles.push_back(0);
Edit:找到标准草案中的部分(值类型与set
和multiset
的关键字相同: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);
但我有一种感觉,有更多的错误与语法有关的地方。
相关文章:
- 推导 std::vector::back() 的返回类型
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- vector.push_back(vector.back()+1) 是未定义的行为吗?
- C++自己的对象堆栈.在 push() 上复制了什么?
- C++ push() 和 pop() 方法使用指针的动态 LinkedList 的问题
- 如何像在javascript中一样"push" c ++映射
- 线路抑制状态错误 C4703 可能未初始化的局部指针变量"back"已使用
- std::vector using back(), pop_back(), push_back(), 得到'double free or corruption'错误
- vector.back()和vector.end()有什么区别
- 列表大小为 1,但 front() 和 back() 不相等
- 返回C++中没有 back() 方法的容器的最后一个元素?
- 在非空 std::list 上使用 std::list.back<int>() 时"Segmentation Fault"
- 模板堆栈类的复制构造函数中的 pop() 和 push() 不起作用
- 我们可以使用Back() - 值索引在其上执行向量插入
- 当我运行以下代码添加str.front() str.back时,它给了我200个,但为什么
- push(ing)back在循环中对象指针
- 在 C++ 中将元素添加到空向量:为什么 push.back 有效而 [] 无效
- 我似乎无法让 v.push.back() 处理字符串
- String::push_back() does not push back
- 向量resize(), push.back(), reserve()方法