如何克服以下有关 std::vector 的错误<bool>?

How do I get over the following error about std::vector<bool>?

本文关键字:vector 错误 gt lt bool std 克服 何克服      更新时间:2023-10-16

似乎vector<bool>不像通常的向量那样工作

auto it = find(flags.rbegin(), flags.rend(), false);
flags.erase(it+1, flags.end());

我想删除(严格(在最后第一个 false 之后出现的元素。代码(仅第 2 行(产生长模板错误,最后一行为:

/

usr/include/c++/5/bits/stl_bvector.h:1025:5:注意:参数 1 没有已知的从 'std::reverse_iterator' 到 'std::vector::const_iterator {aka std::_Bit_const_iterator}' 的转换

您在擦除调用中混合了两种类型的迭代器,而它需要删除两个定义范围的兼容迭代器。

我想这就是你想要的:

 std::vector<bool> flags({false, true, false, true, true});
 auto it = std::find(flags.rbegin(), flags.rend(), false);
 flags.erase(std::next(it.base()), flags.end());

虽然std::vector<bool>确实不像普通向量那样工作,但这个特殊问题与其特性(同步(无关。

同一范围内的反向迭代器和正向迭代器是不同的类型:它们不直接兼容。

由于it是从rbegin()rend()中找到的,所以它是一个反向迭代器。注意:这也意味着it + 1it更接近flags的开始。

您需要做的是将反向迭代器转换为其底层正态迭代器:

flags.erase(it.base() + 1, flags.end());

在你的第一行中,你会得到一个reverse_iterator,因为你在find((中使用了rbegin((rend((函数。但是,flags.erase((需要一个 std::vector::const_iterator,因此你会在第一个参数中得到类型不匹配。

考虑使用 cbegin(( 和 cend(( 函数查找第一个假值,例如:

auto it = find(flags.cbegin(), flags.cend(), false);

PS:还要考虑检查迭代器的值是否不是向量中的最后一个,以避免尝试擦除不存在的内容。