我有一个实际上是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;
}
所以现在我必须将正确的函数重定向到内部指针才能使其正常工作。哪个C ++概念必须符合MyVector
?
如何在内部std::shared_ptr
为nullptr
时,MyVector
的行为与空std::vector
完全相同(以便在基于范围的基础上不会崩溃)循环,但根本不会进行迭代)?
答案 0 :(得分:-2)
要回答您的问题,请参阅cppreference documentation
中有关循环的范围说明{
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()
;
首先,您需要提供begin()
方法,end()
方法。两者都应该返回某种迭代器类的实例(它们可以是不同类型的!)
begin()
返回的迭代器应该支持preincrement运算符和dereference运算符,如上面的解释所推断的那样。
最后begin()
和end()
返回的迭代器应该与!=
相当。