尝试按照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);
知道什么是错的吗?
答案 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
编译,但我不知道它是否做得对。