首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost icl interval_map interval_set模板

boost icl interval_map interval_set模板
EN

Stack Overflow用户
提问于 2012-09-11 01:03:22
回答 1查看 1.2K关注 0票数 1

我已经开始使用boost:icl库,它非常全面和方便。我主要使用boost中的两种间隔: boost::icl::interval_set和boost::icl::interval_map。有时我不得不处理这两种类型的间隔部分,而且我对做复制函数不感兴趣。

下面是我的例子:

代码语言:javascript
复制
template<typename T>
void UniqSegmentsInA(T &a,T &b,T &c,int max_gap=200)
{
typename T::iterator __it1 = a.begin();
typename T::iterator __it2 = b.begin();
bool _checking_=true;

while(__it1 != a.end() && __it2 != b.end())
{
    typename T::interval_type __itv1  = getFirst(*__it1);
    typename T::interval_type __itv2  = getFirst(*__it2);

    if(__itv1.upper()>__itv2.upper())
    {
        /*if segments intersect and we should move second segment then segment A should not be included in output*/
        if(intersects(T::interval_type::closed(__itv1.lower()-max_gap,__itv1.upper()+max_gap),__itv2)) _checking_=false;
        __it2++;
    }
    else
    {
        if(!intersects(T::interval_type::closed(__itv1.lower()-max_gap,__itv1.upper()+max_gap),__itv2) && _checking_)
        {
            c.add((*__it1));
        }
        _checking_=true;
        __it1++;
    }
}
if(__it1 != a.end() && !_checking_) __it1++;
while(__it1 != a.end())
{
    c.add(*__it1);
    __it1++;
}
}

getFirst()是一个辅助函数,当它是一个映射时,它返回.first,当它是一个集合时,它只是一个迭代器。

代码语言:javascript
复制
bicl::interval_map<int,int>::interval_type inline getFirst(bicl::interval_map<int,int>::segment_type a)
{
return a.first;
}

bicl::interval_set<int>::interval_type inline getFirst(bicl::interval_set<int>::segment_type a)
{
return a;
}

因此,此示例的工作方式与预期一致。我想要改进的是getFirst()函数,我不希望在interval_map/set中硬编码domain和codomain类型。我尝试过这样的东西:

代码语言:javascript
复制
template<typename T>
typename bicl::interval_map<T,T>::interval_type inline getFirst(typename bicl::interval_map<T,T>::segment_type a)
{
return a.first;
}

然后我改变了:

代码语言:javascript
复制
    typename T::interval_type __itv1  = getFirst<typename T::domain_type>(*__it1);
    typename T::interval_type __itv2  = getFirst<typename T::domain_type>(*__it2);

但是它不工作,编译器给出一个错误:

代码语言:javascript
复制
src/Intersections.cpp:324:35: error: no matching function for call to ‘getFirst(const std::pair<const boost::icl::discrete_interval<int, std::less>, int>&)’
src/Intersections.cpp:324:35: note: candidates are:
src/Intersections.cpp:52:56: note: template<class T> typename boost::icl::interval_map<T, T>::interval_type getFirst(typename boost::icl::interval_map<T, T>::segment_type)
src/Intersections.cpp:57:56: note: boost::icl::interval_set<int>::interval_type getFirst(boost::icl::interval_set<int>::segment_type)
src/Intersections.cpp:57:56: note:   no known conversion for argument 1 from ‘const std::pair<const boost::icl::discrete_interval<int, std::less>, int>’ to ‘boost::icl::interval_set<int>::segment_type {aka boost::icl::discrete_interval<int, std::less>}’

所以问题是,在这个例子中,有没有可能不在getFirst()函数中硬编码域和协域类型?

谢谢,安德烈

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-27 05:17:18

您可以使用函数模板

代码语言:javascript
复制
key_value

为了这个目的。它在中定义

代码语言:javascript
复制
boost\icl\concept\set_value.hpp
and
boost\icl\concept\map_value.hpp

像这样

代码语言:javascript
复制
template<class Type, class Iterator>
inline typename enable_if<is_set<Type>, const typename Type::key_type>::type&
key_value(Iterator it_)
{
    return *it_;
}

template<class Type, class Iterator>
inline typename enable_if<is_map<Type>, const typename Type::key_type>::type&
key_value(Iterator it_)
{
    return (*it_).first;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12356306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档