【问题标题】:Iterating boost::icl::interval_set迭代 boost::icl::interval_set
【发布时间】:2015-01-29 14:30:55
【问题描述】:

我正在迭代一个boost interval_set<unsigned_int>,我希望每个迭代器都是一个boost interval,其值将通过upperlower 方法访问:

boost::icl::interval_set<unsigned int> outages;
// ...
// Insert intervals into the database
for(boost::icl::interval_set<unsigned int>::iterator it =
    outages.begin(); it != outages.end(); it++){

    DATA_ACQUISITION::InsertInterval(db, it->lower(),
        it->upper())
}

但我在 lowerupper 方法中都收到错误:方法 ... 无法解析,这表明迭代器未指向 interval全部。

那么,我在这里真正迭代的是什么?如何迭代插入到interval_set 中的intervals

编辑:添加 SSCCE:

#include <boost/icl/interval_set.hpp>
#include <iostream>
#include <vector>


int main() {
    boost::icl::interval_set<unsigned int> outages;
    for(unsigned int i=0; i<5; i++){
        outages += boost::icl::discrete_interval<unsigned int>::closed(
            (i*10), ((i*10) + 5));
    }

    for(boost::icl::interval_set<unsigned int>::iterator it =
        outages.begin(); it != outages.end(); it++){

        std::cout << it->lower() << boost::icl::upper(*it);
    }
    return 0;
}

附加信息:

  • 我目前没有在链接器中添加任何库(到现在为止,没有错误提示我需要那个,并且还没有找到我应该将哪个参数添加到 -l 中)
    • 编译器 g++ 4.8.1
    • 升压版本:1.46

【问题讨论】:

  • 我会重新安装/手动安装 boost。我已经使用 GCC 4.8.2 编译了 SSCCE,并从 wget http://sourceforge.net/projects/boost/files/boost/1.46.0/boost_1_46_0,1.tar.bz2(以及 1_47_1)提升。
  • @sehe 已重新安装 1_46_0,但与 Ubuntu 12.04 repo 的版本相比,仍然存在相同的问题。 it->lowers 抛出错误“方法 lower 无法解析”,boost::icl::upper(*it) 抛出“无效参数”,并建议作为候选者“boost:enable::if<:icl: :invercal>、bost::icl::inverval_traits::domain_type::type upper(const #0 &)',以及其他类似的选择,但不相关。这很奇怪,接下来我该尝试什么?
  • 建议保持不变。您看到具有相同版本的不同来源是没有意义的。尝试打印增强版本:coliru.stacked-crooked.com/a/f7a2ee559e0cf008 或检查预处理源。检查另一个系统等(可能安装了冲突版本,例如/usr/include vs /usr/local/include)。

标签: c++ boost boost-icl


【解决方案1】:

至少在最新的提升中,这不是问题:

Live On Coliru

#include <boost/icl/interval_set.hpp>
#include <iostream>

int main() {
    typedef boost::icl::interval_set<unsigned int> set_t;
    typedef set_t::interval_type ival;
    set_t outages;

    outages.insert(ival::closed(1,1));
    outages.insert(ival::open(7,10));
    outages.insert(ival::open(8,11));
    outages.insert(ival::open(90,120));

    for(set_t::iterator it = outages.begin(); it != outages.end(); it++){
        std::cout << it->lower() << ", " << it->upper() << "\n";
    }
}

打印

1, 1
7, 11
90, 120

如果旧的 bo​​ost 版本不直接支持成员,请尝试免费功能:

std::cout << lower(*it) << ", " << upper(*it) << "\n";

在这里,ADL 找到在 boost::icl 命名空间中声明的重载

【讨论】:

  • 我猜我的问题是来自 Ubuntu 存储库的旧版本。无论如何,我尝试使用 lower(*it)、boost::icl::lower(*it) 和上兄弟姐妹,但没有奏效。使用 boost::icl 命名空间时,收到的错误是:“无效参数。候选是 boost::enable_if<:icl::is_interval_container>,boost::icl::domain_type_of:: type>::type lower(const #0 &) boost::enable_if<:icl::is_interval>,boost::icl::interval_traits::domain_type>::type lower(const #0 &)
  • 顺便说一句:我想这没什么区别,但请考虑到我的 interval_set 填充了 boost::icl::discrete_interval::closed,以防万一
  • @RomanRdgz 看起来其他东西有点无聊:/如果你能把它变成 SSCCE,我很乐意提供帮助(PS. Re. 2nd comment:这不重要,确实)
  • 我添加了 SSCCE。我混合了 lower 和 upper 的代码,只是为了检查它们中的任何一个是否适合我。
【解决方案2】:

最后,我意识到错误不是来自编译,而是来自 Eclipse CDT,根本没有影响。

【讨论】:

  • 哇。棒极了。我很高兴我没有鼓励追逐野鹅! (经验教训:如果问题在没有它的情况下无法解释,请考虑在答案中提供更多上下文)。您可能应该接受这个作为答案(即使它与问题无关)。它/可能/对 googler 有帮助。
  • (哦。我在新的 SO 网站设计中遇到了错误的缩放问题。看不到接受标记)
  • @sehe 我还是要谢谢你。即使您没有直接解决我的问题,您也付出了很多努力帮助我过滤了可能的原因。
猜你喜欢
  • 2016-01-20
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多