我正在实现一个包含STL std::vector
作为中央数据成员的自定义类。
现在,我希望这个类提供一个迭代器,它只需要迭代这个向量,也可以使用基于C ++ 11范围的迭代。
以某种方式从std::vector::iterator
继承迭代器是非常诱人的,因为它应该完成相同的工作。这是可能的还是我需要实现一个完全自定义的迭代器?
class Custom {
private:
std::vector<double> _data;
public:
class iterator {
// Want this to provide an interface to iterate through _data
// ...
};
// ...
};
Custom C;
// Populate C with data ...
for (const auto& item : C) {
// This should print the elements within _data.
std::cout << item << std::endl;
}
答案 0 :(得分:1)
您不需要从迭代器本身继承。您可以只为std::vector<double>
使用的迭代器提供接口。
以下是一个快速摘录:
#include <vector>
#include <iostream>
class Custom {
private:
std::vector<double> _data;
public:
explicit Custom(std::initializer_list<double> init) : _data(init) {}
using iterator = std::vector<double>::iterator;
using const_iterator = std::vector<double>::const_iterator;
iterator begin()
{
return _data.begin();
}
iterator end()
{
return _data.end();
}
const_iterator cbegin() const
{
return _data.cbegin();
}
const_iterator cend() const
{
return _data.cend();
}
};
int main()
{
Custom C({ 1.0,2.0,3.0,4.0,5.0 });
for (const auto &item : C)
{
std::cout << item << "\n";
}
return 0;
}
答案 1 :(得分:0)
您可以为
制作公共代理功能vector<T>::begin()
vector<T>::end()
vector<T>::cbegin()
vector<T>::cend()
迭代你的对象:
Custom custom;
// here insert any data
for(auto it = custom.cbegin(); it != custom.cend(); ++it){
cout << *it;
}
此外,它适用于基于范围的:
for(const auto &val : custom){
cout << val;
}