0

我有一个按 z 顺序排序的节点列表(http://en.wikipedia.org/wiki/Z-order_curve)。我试图找到比 zPosition 更大的第一个节点。iterTransform 对象接受一个迭代器并返回一个二进制位置表示(与 zPosition 类型相同)。这种类型可以通过pathCmp进行比较

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 < UnaryFunc,Iterator,Reference,Value >”转换为“std::_Vector_iterator<_Myvec>”

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

4

2 回答 2

2

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();

应该工作假设begin并且endNodeIterT类型。

于 2012-05-24T14:36:47.240 回答
2

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()
于 2012-05-24T14:37:50.343 回答