继承自定义类的std :: vector :: iterator?

时间:2016-04-04 14:34:31

标签: c++ c++11 vector stl iterator

我正在实现一个包含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;
}

2 个答案:

答案 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;
}