使用boost interval_map

时间:2013-12-04 22:42:26

标签: c++ boost

尝试按照interval_map的boost_party示例制作了此示例代码:

#include "boost/icl/interval.hpp"
#include "boost/icl/interval_map.hpp"
#include <set>
using namespace std;

typedef std::set<string> ids;

int main(int argc, char* argv[])
{
    ids ids1;   
    ids1.insert("T1");
    ids ids2;
    ids2.insert("T2");
    boost::icl::interval_map<boost::icl::closed_interval<int>, ids> mymap;
    boost::icl::closed_interval<int> i1 = boost::icl::closed_interval<int>(2, 7);
    boost::icl::closed_interval<int> i2 = boost::icl::closed_interval<int>(3, 8);
    mymap += make_pair(i1, ids1);
    mymap += make_pair(i2, ids2);
    return 0;
}

但是这得到了这个编译错误:

error: no match for ‘operator+=’ (operand types are ‘boost::icl::interval_map<boost::icl::closed_interval<int>, std::set<std::basic_string<char> > >’ and ‘std::pair<boost::icl::closed_interval<int>, std::set<std::basic_string<char> > >’)
  mymap += make_pair(i1, ids1);

知道什么是错的吗?

4 个答案:

答案 0 :(得分:2)

最有可能是mymap.insert(make_pair(...));而不是mymap += make_pair(...);。这是std::unordered_map的语法。

答案 1 :(得分:1)

也许我有点晚了,但这会编译:

#include "boost/icl/interval.hpp"
#include "boost/icl/interval_map.hpp"
#include <set>
using namespace std;

typedef std::set<string> ids;

int main(int argc, char* argv[])
{
    ids ids1;   
    ids1.insert("T1");
    ids ids2;
    ids2.insert("T2");
    boost::icl::interval_map<int, ids> mymap;
    auto i1 = boost::icl::interval<int>::closed(2, 7);
    auto i2 = boost::icl::interval<int>::closed(3, 8);
    mymap += make_pair(i1, ids1);
    mymap += make_pair(i2, ids2);
    return 0;
}

但是,如果这符合您的预期语义,则必须检查。

答案 2 :(得分:1)

实际上问题在于你对interval_map的声明:

 boost::icl::interval_map<boost::icl::closed_interval<int>, ids> mymap;

问题是,库自动要创建您提供的第一种类型的间隔。所以在你的情况下,map的关键是整数间隔的间隔。 因此,在您的情况下,您需要做的就是使用:

boost::icl::interval_map<int, ids> mymap;

在这种情况下,您的地图将 int spacing 映射到字符串集上。

答案 3 :(得分:0)

首先,将+=替换为.insert(...)。 (我从来不清楚何时使用+=insert,我总是使用insert

其次,我认为interval_map的关键是int,而不是discrete_interval<int>。此外,我不认为间隔是关闭还是(半)开放取决于您。在discrete个时间间隔内,开放区间的联合可以成为闭合区间。所以让动态类型系统为您选择。代码最终看起来像这样(C ++ 98,用g++ 4.8.3编译)

typedef std::set<std::string> ids;

ids ids1;   
ids1.insert("T1");
ids ids2;
ids2.insert("T2");
boost::icl::interval_map<int, ids> mymap;
boost::icl::discrete_interval<int> i1 = boost::icl::discrete_interval<int>::closed(2, 7);
boost::icl::discrete_interval<int> i2 = boost::icl::discrete_interval<int>::closed(3, 8);
mymap.insert(make_pair(i1, ids1));
mymap.insert(make_pair(i2, ids2));

好奇心:你的代码用-std=c++11编译,但我不知道它是否做得对。