如何克服以下有关 std::vector 的错误<bool>?
How do I get over the following error about std::vector<bool>?
似乎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 + 1
比it
更接近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:还要考虑检查迭代器的值是否不是向量中的最后一个,以避免尝试擦除不存在的内容。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- vector.resize()中的分配错误
- 在某些循环内使用vector.push_back时出现分段错误
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- "no matching function for call to 'Vector::Vector'"错误
- 为什么当 vector 为空时会显示运行时错误?
- 将 vector<vector<int>> 传递到函数中会产生内存错误
- C++ 向量加减抛出"expression: vector subscript out of range."错误
- 错误:调用"es_queue::set_rpc_vector(std::vector >&, std::__cxx11::string)"没有匹配函数
- AddressSanitizer 将 std::vector<T>::p ush_back 标识为释放后堆使用错误的原因
- 在c++Primer中使用Struct和Vector时出现错误C2661
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 如何解决'vector subscript out of range'错误?
- 错误 C2280 / 在 std::vector 中实例化对象时复制构造函数出现问题?
- 迭代 std::vector 时的分段错误
- C++如果调用 vector,矢量分割错误会导致崩溃
- 在调用中使用 std::vector,<double>但收到有关 std::vector<double、std::分配器>正在使用的错误<double>
- Boost的属性.Spirit语法:Boost::variant的std:vector错误
- Qt #include <vector> 错误
- 获取"terminating with uncaught exception of type std::length_error: vector"错误C++