C++ 对于具有迭代器范围的循环,可以使用基于范围的吗?

C++ 对于具有迭代器范围的循环,可以使用基于范围的吗?,c++,c++11,stl,C++,C++11,Stl,考虑与std::multimap一起使用,其中为我提供了一系列迭代器: std::unordered_multimap<std::string, MyObject> mymap; auto& range = mymap.equal_range("some_key"); for (auto& the_pair : range) { } std::无序的\u多重映射mymap; auto&range=mymap.equal_range(“某个_键”); 用于(自动和_

考虑与
std::multimap
一起使用,其中为我提供了一系列迭代器:

std::unordered_multimap<std::string, MyObject> mymap;

auto& range = mymap.equal_range("some_key");
for (auto& the_pair : range)
{
}
std::无序的\u多重映射mymap;
auto&range=mymap.equal_range(“某个_键”);
用于(自动和_对:范围)
{
}
现在,上面的代码没有编译,但我使用它进行演示。是否可以将基于范围的for循环与这样的一对迭代器一起使用?我不认为这是直接可能的,所以我想我的问题实际上是关于STL中是否有一个用于此用例的适配器类。我可能会写我自己的,但这似乎是一个常见的情况

更新:
如果这不是常见的情况,并且STL没有为这种类型的使用提供这样的代理或适配器,那么实现它们需要什么?我想我需要重载自由函数
begin
end
,并为
std::pair
定义一个适配器迭代器类。我只是在概念上尝试一下,但请让我知道!提前感谢大家。

否,呼叫范围基于
std::begin
std::end
std::pair
没有任何重载。在某一点上,这一点,但被删除。您可以编写自己的代码。从sellibitze偷窃:

template<class Iter>
struct iter_pair_range : std::pair<Iter,Iter> {
    iter_pair_range(std::pair<Iter,Iter> const& x)
    : std::pair<Iter,Iter>(x)
    {}
    Iter begin() const {return this->first;}
    Iter end()   const {return this->second;}
};

template<class Iter>
inline iter_pair_range<Iter> as_range(std::pair<Iter,Iter> const& x)
{ return iter_pair_range<Iter>(x); }

int main() {
    std::unordered_multimap<std::string, MyObject> mymap;

    auto range = mymap.equal_range("some_key");
    for (auto& the_pair : as_range(range))
    {
    }
}
模板
结构iter\u对范围:std::pair{
iter成对范围(标准:成对常数和x)
:std::对(x)
{}
Iter begin()常量{返回this->first;}
Iter end()常量{返回此->秒;}
};
模板
内联iter\u pair\u range as\u range(标准::pair const&x)
{返回iter_对_范围(x);}
int main(){
std::无序_多重映射mymap;
自动范围=mymap.equal_范围(“某个_键”);
用于(自动和_对:as_范围(范围))
{
}
}

您可以查看2009年的内容,其中谈到了向标准库添加范围支持。也许你最好使用。

基于模板的答案可能就是你想要的,但是我会使用一个lambda来代替。它更干净,更容易消化。

< P>用C++ 20,你可以使用./P>
std::无序的\u多重映射mymap;
自动范围=mymap.equal_范围(“某个_键”);
对于(自动和[键,值]:std::ranges::subrange(range.first,range.second))
{
}

您的
iter\u pair\u range
类假设成对中的两种类型都是相同的类型,但在我的示例中并非如此。@void.pointer您的意思是什么?Equal_range将始终返回一对相同的type@void.pointer这对中的类型不同,但迭代器类型不同。在这两种情况下,它都是一个
multimap::const_迭代器。事实上,基于范围的for甚至不能用于返回不同类型迭代器的
begin()
end()
对象。很抱歉,我看到的是错误的
对对象!为什么要将其从标准中删除?有人知道吗?我最终用了你的推荐,我甚至没有考虑<代码> STD::FuyYouth。这要简单得多。然而,我的问题特别需要一个基于范围的解决方案,所以我会接受这个答案。谢谢你的提醒!
std::unordered_multimap<std::string, MyObject> mymap;

auto range = mymap.equal_range("some_key");
for (auto & [key, value] : std::ranges::subrange(range.first, range.second))
{
}