boost::transform_iterator in std::upper_bound 编译错误

boost::transform_iterator in std::upper_bound compile error

本文关键字:bound 编译 错误 upper in transform iterator boost std      更新时间:2023-10-16

我有一个按z顺序(http://en.wikipedia.org/wiki/Z-order_curve)排序的节点列表。我正在尝试找到第一个大于zPosition的节点。iterTransform 对象采用迭代器并返回二进制位置表示形式(与 zPosition 类型相同)。这种类型可以通过路径Cmp进行比较

NodeIterT last = std::upper_bound(
    boost::make_transform_iterator(begin, iterTransform), // return PathType
    boost::make_transform_iterator(end, iterTransform),
    zPosition,
    pathCmp ); // takes two PathType arguments

编译时我得到

错误 C2440:"正在初始化":无法从"boost::transform_iterator <一元函数,迭代器,引用,值>"转换为"标准::_Vector_iterator<_Myvec>"

这个最小化的示例是否有任何错误,或者我需要提供更多代码?

std::upper_bound返回一个transform_iterator。添加.base()以获取包装的迭代器类型:

NodeIterT last = std::upper_bound(
boost::make_transform_iterator(begin, iterTransform), // return PathType
boost::make_transform_iterator(end, iterTransform),
zPosition,
pathCmp ).base();

假设beginend属于NodeIterT类型,应该可以工作。

std::upper_bound返回一个迭代器,其类型与作为参数给出的类型相同。因此,在您的情况下,返回类型是 boost::transform_iterator<...> 而不是 std::vector<...>::iterator

如果要访问底层迭代器,可以使用 base() 成员函数:

NodeIterT last = std::upper_bound(
    boost::make_transform_iterator(begin, iterTransform), // return PathType
    boost::make_transform_iterator(end, iterTransform),
    zPosition,
    pathCmp ).base(); // note the call to base()