Boost c ++库interval_map是否支持删除?

问题描述 投票:3回答:1

interval_map(在icl中)库是否支持删除?我可以根据迭代器查找范围并删除范围吗?

============来自boost示例的party.cpp ===============

partyp->add( // add and element
  make_pair( 
    interval<ptime>::right_open(
      time_from_string("2008-05-20 19:30"), 
      time_from_string("2008-05-20 23:00")), 
    mary_harry));

party += // element addition can also be done via operator +=
  make_pair( 
    interval<ptime>::right_open(
      time_from_string("2008-05-20 20:10"), 
      time_from_string("2008-05-21 00:00")), 
    diana_susan);

party +=
  make_pair( 
    interval<ptime>::right_open(
      time_from_string("2008-05-20 22:15"), 
      time_from_string("2008-05-21 00:30")), 
    peter);

==========我的问题是我可以添加一个删除语句

 party -= 
        interval<ptime>::right_open(
          time_from_string("2008-05-20 20:10"), 
          time_from_string("2008-05-21 00:00"));

我只想删除范围。任何方法都没问题。

c++ boost intervals
1个回答
0
投票

我知道这是一个老帖子,但我有同样的问题,我终于找到了答案。

看看docs我猜想interval_map的Subtractability和重叠能力上的聚合保证了减法作为删除操作。

事实证明,如果将间隔值对插入到interval_map中导致插入的间隔值对与间隔值对发生冲突,则将加法或减法传播到interval_map的关联值是一个非常富有成效的概念,即已经在interval_map中。此操作传播在重叠时称为聚合。

假设我必须将unix时间戳的间隔与某些记录ID(整数)进行匹配。在这个answer工作,我想出了这个MWE:

// interval_map_mwe.cpp
#include <map>
#include <set>
#include <climits>

#include <boost/icl/interval.hpp>
#include <boost/icl/interval_map.hpp>

// Set of IDs that cover a time interval
typedef std::set<unsigned int> IDSet_t;
// interval tree from intervals of timestamps to a set of ids
typedef boost::icl::interval_map<time_t, IDSet_t> IMap_t;
// a time interval
typedef boost::icl::interval<time_t> Interval_t;

#include <iostream>
// from https://stackoverflow.com/a/22027957
inline std::ostream& operator<< (std::ostream& S, const IDSet_t& X)
{
    S << '(';
    for (IDSet_t::const_iterator it = X.begin(); it != X.end(); ++it) {
        if (it != X.begin()) {
            S << ',';
        }
        S << *it;
    }
    S << ')';
    return S;
}

int main(int argc, const char *argv[])
{
    (void)argc; // suppress warning
    (void)argv; // suppress warning

    IMap_t m;

    IDSet_t s;
    s.insert(1);
    s.insert(2);
    m += std::make_pair(Interval_t::right_open(100, 200), s);

    s = IDSet_t();
    s.insert(3);
    s.insert(4);
    m += std::make_pair(Interval_t::right_open(200, 300), s);

    s = IDSet_t();
    s.insert(5);
    s.insert(6);
    m += std::make_pair(Interval_t::right_open(150, 250), s);

    std::cout << "Initial map: " << std::endl;
    std::cout << m << std::endl;

    // find operation
    IMap_t::const_iterator it = m.find(175);

    std::cout << "Interval that covers 175: ";
    std::cout << it->first << std::endl;
    std::cout << "Ids in interval: " << it->second << std::endl;

    // partially remove 5 from interval (160,180)
    s = IDSet_t();
    s.insert(5);
    m -= std::make_pair(Interval_t::right_open(160, 180), s);

    std::cout << "map with 5 partially removed:" << std::endl;
    std::cout << m << std::endl;

    // completelly remove 6
    s = IDSet_t();
    s.insert(6);
    // Note: maybe the range of the interval could be shorter if you can somehow obtain the minimum and maximum times
    m -= std::make_pair(Interval_t::right_open(0, UINT_MAX), s);

    std::cout << "map without 6: " << std::endl;
    std::cout << m << std::endl;

    // remove a time interval
    m -= Interval_t::right_open(160, 170);

    std::cout << "map with time span removed: " << std::endl;
    std::cout << m << std::endl;

    return 0;
}

用g ++ 4.4.7编译:

g++ -Wall -Wextra -std=c++98 -I /usr/include/boost148/ interval_map_mwe.cpp

我得到的输出是

Initial map:
{([100,150)->{1 2 })([150,200)->{1 2 5 6 })([200,250)->{3 4 5 6 })([250,300)->{3 4 })}
Interval that covers 175: [150,200)
Ids in interval: (1,2,5,6)
map with 5 partially removed:
{([100,150)->{1 2 })([150,160)->{1 2 5 6 })([160,180)->{1 2 6 })([180,200)->{1 2 5 6 })([200,250)->{3 4 5 6 })([250,300)->{3 4 })}
map without 6:
{([100,150)->{1 2 })([150,160)->{1 2 5 })([160,180)->{1 2 })([180,200)->{1 2 5 })([200,250)->{3 4 5 })([250,300)->{3 4 })}
map with time span removed:
{([100,150)->{1 2 })([150,160)->{1 2 5 })([170,180)->{1 2 })([180,200)->{1 2 5 })([200,250)->{3 4 5 })([250,300)->{3 4 })}

注意:MWE中的数字可以被认为是随机的。我发现用较小的数字来推理这个例子更容易。

© www.soinside.com 2019 - 2024. All rights reserved.