QVector中使用contains的注意事项

本文描述的问题其实在帮助手册中已经进行了描述:

bool QVector::contains(const T &value) const

Returns true if the vector contains an occurrence of value; otherwise returns false.

This function requires the value type to have an implementation of operator==().

这话翻译过来就是,如果要在Qvector下实现contains的功能,就需要重载==运算符。

什么意思呢?大家都知道QVector是一个模板类,对于QT的内置类型如int、double、QString等类型QT做了处理,故这些类型本身无需重载==运算符就可实现比较功能;但是对于自定义类型,如自定义类类型, 例如自定义类类型A,在QVector<A>如果存在使用如下语句:

QVector<A> vtest;
....
A a;
if(!vtest.contains(a))  //对A类型下使用contains进行判断,A类型默认是不支持类类型比较的,需要用户实现
    vtest.push_back(a);

若要实现上述的功能需要,需要类A实现==运算符重载,如下所示:

class A{
A();
...
bool operator==(const A& a)
{
    ....
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
回答: 在引用\[1\]的代码清单使用了`std::find`函数来查找`vecId`是否存在值为2042的元素,并将返回的迭代器赋值给`iteVec`。然后通过判断`iteVec`是否等于`vecId.end()`来确定是否找到了该元素。如果找到了,就使用`vecId.erase(iteVec)`来删除该元素。\[1\] 然而,在引用\[2\]的错误信息指出,在QVector使用`erase`函数时,传入的迭代器参数`aend`是无效的。这可能是由于迭代器已经失效或者指向了一个无效的位置。因此,需要确保在调用`erase`函数之前,迭代器仍然有效。\[2\] 在引用\[3\]的示例代码,为了解决这个问题,使用了重新遍历的方法。首先使用`entities.at(i)`来判断`entities`的第`i`个元素是否存活。如果不存活,则重新使用迭代器遍历`entities`,并使用`entities.erase(iter)`来删除该元素。需要注意的是,这里使用了`entities.begin()`来初始化迭代器`iter`,并通过`iter++`来逐个移动迭代器的位置,直到找到需要删除的元素。\[3\] 总结来说,如果在QVector删除元素后再使用`erase`函数,需要确保传入的迭代器仍然有效。如果迭代器失效,可以考虑重新遍历容器并使用迭代器来删除元素。 #### 引用[.reference_title] - *1* [4.5 案例9 使用QVector处理数组](https://blog.csdn.net/weixin_35315373/article/details/112964727)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [有关ASSERT failure in QVector::erase: “The specified iterator argument ‘aend‘ is invalid“问题的...](https://blog.csdn.net/qq_32162235/article/details/107137709)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C++ vector 的 erase() 仍引发崩溃](https://blog.csdn.net/cjz2005/article/details/119832043)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值