首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于pair<Iterator,Iterator>的范围

基于pair<Iterator,Iterator>的范围
EN

Stack Overflow用户
提问于 2014-11-26 03:21:46
回答 5查看 8.3K关注 0票数 6

我有一个关于以下答案的问题:

https://stackoverflow.com/a/15828866/2160256

如前所述,我们不能像这样使用基于BGL的范围:

代码语言:javascript
复制
   for(auto e : boost::edges(g))
       // do something with e

但是,这里 it声明,我们可以重载begin()和end()函数,这些函数是使用基于范围的语义所必需的。所以我试着:

代码语言:javascript
复制
   template<class I>
   I begin(std::pair<I,I>& p)
   { return p.first;}

   template<class I>
   I end(std::pair<I,I>& p)
   { return p.second;}

但是,编译器仍然抱怨:

错误:调用“begin(std::pair<some_really_ugly_type,some_really_ugly_type>&)”没有匹配函数

我做错了什么?名字查找不起作用吗?还是说这根本不可能?我还找到了这个答案,它可以工作,但它不应该是可能的开始/结束自由函数覆盖以及?你好,玛蒂

顺便说一句:我觉得写东西真的很累人。

代码语言:javascript
复制
   typename Graph::edge_iterator ebegin, eend;
   std::tie(ebegin,eend) = boost::edges(_graph);
   std::for_each(ebegin,eend,[&](const edge_descriptor& e){/*do something with e*/;});

更新: C++17现在应该允许以下内容:)

代码语言:javascript
复制
auto [ebegin,eend] = boost::edges(_graph);
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-11-26 03:29:58

在基于范围的for循环中,非会员begin()end()的名称查找仅使用ADL .它不执行普通的不合格查找。§6.5.4 Stmt.range/P1.3:

  • 如果_RangeT是类类型,则在类_RangeT的作用域中查找_unqualified id_s beginend,就好像通过类成员访问查找(3.4.5)一样,如果其中一种(或两者都)找到至少一种声明,.
  • 否则,开始扩展和结束扩展分别是begin(__range)end(__range),其中beginend在关联的命名空间中被查找(3.4.2)。注意:不执行普通的不合格查找(3.4.1)。-end注记

因此,找不到您的begin()end()重载。

票数 5
EN

Stack Overflow用户

发布于 2014-11-26 08:44:19

Iterator对是而不是的设计范围!语言和库规范明确拒绝了这一想法。见A.

  • 纸张成双成对的范围不好

如果编写tie()解决方案“觉得很烦人”,只需使用

代码语言:javascript
复制
for (auto& edge : make_iterator_range(boost::edges(_graph)))
    /*do something with edge*/;

您可以将boost::make_iterator_range命名为更短的东西,但我的编辑器建议在输入mir时将make_iterator_range作为完成。这对我来说已经够快了

当然,那个编辑就是Vim

票数 7
EN

Stack Overflow用户

发布于 2014-11-26 03:36:38

您不能像按照begin()那样拥有免费的end()T.C.的回答函数。但是,您可以做的就是创建自己的类并将成员beginend添加到其中:

代码语言:javascript
复制
template <typename I>
struct iter_pair : std::pair<I, I>
{ 
    using std::pair<I, I>::pair;

    I begin() { return this->first; }
    I end() { return this->second; }
};

然后用它代替普通的pair

代码语言:javascript
复制
std::vector<int> v = {1, 2, 3, 4, 5};

iter_pair<decltype(v.begin())> pr{v.begin(), v.end()};

for (int i : pr) {
    std::cout << i << ' ';
}
std::cout << std::endl;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27140778

复制
相关文章

相似问题

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