我有一个按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>'
此最小化示例中是否有任何错误,或者我是否需要提供更多代码?
答案 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();
假设begin
和end
属于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()