shu*_*e87 59 c++ iterator c++11
我正在编写一个用于代替STL容器的容器的迭代器.目前,STL容器正在许多地方使用c ++ 11 foreach语法,例如:for(auto &x: C)
.我们需要更新代码以使用包装STL容器的自定义类:
template< typename Type>
class SomeSortedContainer{
std::vector<typename Type> m_data; //we wish to iterate over this
//container implementation code
};
class SomeSortedContainerIterator{
//iterator code
};
Run Code Online (Sandbox Code Playgroud)
如何让自动为自定义容器使用正确的迭代器,以便能够以下列方式调用代码?:
SomeSortedContainer C;
for(auto &x : C){
//do something with x...
}
Run Code Online (Sandbox Code Playgroud)
一般来说,确保auto为类使用正确的迭代器需要什么?
Moo*_*uck 51
为了能够使用基于范围的,您的班级应该提供const_iterator begin() const
和const_iterator end() const
成员.您也可以重载全局begin
函数,但在我看来,拥有成员函数更好. iterator begin()
并且const_iterator cbegin() const
还建议,但不是必需的.如果您只是想迭代一个内部容器,那真的很容易:
template< typename Type>
class SomeSortedContainer{
std::vector<Type> m_data; //we wish to iterate over this
//container implementation code
public:
typedef typename std::vector<Type>::iterator iterator;
typedef typename std::vector<Type>::const_iterator const_iterator;
iterator begin() {return m_data.begin();}
const_iterator begin() const {return m_data.begin();}
const_iterator cbegin() const {return m_data.cbegin();}
iterator end() {return m_data.end();}
const_iterator end() const {return m_data.end();}
const_iterator cend() const {return m_data.cend();}
};
Run Code Online (Sandbox Code Playgroud)
如果你想迭代任何自定义,你可能必须将自己的迭代器设计为容器内的类.
class const_iterator : public std::iterator<random_access_iterator_tag, Type>{
typename std::vector<Type>::iterator m_data;
const_iterator(typename std::vector<Type>::iterator data) :m_data(data) {}
public:
const_iterator() :m_data() {}
const_iterator(const const_iterator& rhs) :m_data(rhs.m_data) {}
//const iterator implementation code
};
Run Code Online (Sandbox Code Playgroud)
有关编写迭代器类的更多详细信息,请参阅此处的答案.
R. *_*des 51
你有两个选择:
begin
,并end
可以这样调用C.begin()
和C.end()
;begin
和end
可以使用参数相关的查找找到,或命名空间std
,并且可以被称为像begin(C)
和end(C)
.正如其他人所说,您的容器必须实现begin()
和end()
运行(或具有std::
将容器实例作为参数的全局或函数).
这些函数必须返回相同的类型(通常container::iterator
,但这只是一个约定).返回的类型必须实现operator*
,operator++
和operator!=
.
归档时间: |
|
查看次数: |
50349 次 |
最近记录: |