在std :: upper_bound编译错误中的boost :: transform_iterator

时间:2012-05-24 14:25:15

标签: c++ boost iterator

我有一个按z-order(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> 'to'std :: _ Vector_iterator< _Myvec>'

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

2 个答案:

答案 0 :(得分: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();
假设beginend属于NodeIterT类型,

应该有效。

答案 1 :(得分:2)

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

如果要访问底层迭代器,可以使用base() member function

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