什么概念允许容器在基于范围的 for 循环中使用?

What concept allows a container to be usable in a range-based for loop?

本文关键字:for 循环 范围 许容器 于范围 什么      更新时间:2023-10-16

我有一个容器,它实际上是一个std::shared_ptr< std::vector< Element > >。我将这种类型包装到MyVector类中,因为我不希望人们用指针搞砸事情:

class MyVector
{
std::shared_ptr< std::vector< Element > > m_vector;
};

我希望能够将MyVector使用到基于范围的for循环中,如下所示:

int main( )
{
MyVector vector;
// ...
for( const auto& element : vector )
{ 
// ...
}
return 0;
}

所以现在我必须将正确的函数重定向到内部指针才能使其工作。MyVectorC++概念必须符合哪些要求? 我怎样才能实现这样的结果,即当内部std::shared_ptrnullptr时,MyVector的行为就像一个空std::vector(这样它就不会在基于范围的循环中崩溃,但根本不会进行迭代(?

要回答您的问题,请查看 cpp首选项文档中基于范围的 for 循环的解释

{
auto && __range = range_expression ; 
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin) { 
range_declaration = *__begin; 
loop_statement 
} 
} 

而这句话

如果 range_expression 是类类型 C 的表达式,该表达式具有名为 begin 的成员和/或名为 end 的成员(无论此类成员的类型或可访问性如何(,则begin_expr__range.begin()end_expr__range.end();

  1. 所以首先你需要提供一个begin()的方法,一个end()的方法。 两者都应该返回某种迭代器类的实例(它们可以是不同类型的!

  2. begin()返回的迭代器应支持从上述解释推断的预递增运算符和取消引用运算符。

  3. 最后,begin()end()返回的迭代器应该与!=相当。