C++ 为自定义类继承std::vector::迭代器?

C++ 为自定义类继承std::vector::迭代器?,c++,c++11,vector,stl,iterator,C++,C++11,Vector,Stl,Iterator,我正在实现一个自定义类,它包含一个STLstd::vector作为中心数据成员。 现在,我想让这个类提供一个迭代器,它只需要遍历这个向量,还可以使用基于C++11范围的迭代。 很容易从std::vector::iterator继承迭代器,因为它应该做完全相同的工作。这是可能的还是我需要实现一个完全定制的迭代器 class Custom { private: std::vector<double> _data; public: class iterator { // W

我正在实现一个自定义类,它包含一个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;
}
类自定义{
私人:
std::vector_数据;
公众:
类迭代器{
//希望它提供一个接口来遍历_数据吗
// ...
};
// ...
};
海关C;
//用数据填充C。。。
用于(常数自动和项目:C){
//这将打印_数据中的元素。

std::cout您可以为

  • vector::begin()
  • vector::end()
  • vector::cbegin()
  • vector::cend()
  • 以及其他创建迭代器的向量成员函数
然后像这样迭代对象:

Custom custom;

// here insert any data

for(auto it = custom.cbegin(); it != custom.cend(); ++it){
    cout << *it;
}
定制;
//在这里插入任何数据
for(auto-it=custom.cbegin();it!=custom.cend();++it){

cout您不需要从迭代器本身继承。您只需为
std::vector
使用的迭代器提供接口即可

下面是一个简短的片段:

#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;
}
#包括
#包括
阶级风俗{
私人:
std::vector_数据;
公众:
显式自定义(std::initializer\u list init):\u数据(init){
使用迭代器=std::vector::迭代器;
使用常量迭代器=std::vector::常量迭代器;
迭代器begin()
{
返回_data.begin();
} 
迭代器结束()
{
返回_data.end();
} 
常量迭代器cbegin()常量
{
返回_data.cbegin();
} 
常量迭代器cend()常量
{
返回_data.cend();
} 
};
int main()
{
自定义C({1.0,2.0,3.0,4.0,5.0});
用于(常数自动和项目:C)
{

std::cout为什么“继承自”?为什么不简单地键入def?就像在
类Custom{using iterator=std::vector::iterator;};
中一样,要让范围循环工作,您仍然需要实现
begin()
end()
,可能是通过转发到
\u data.begin()
\u data.end()
谢谢,这对我来说非常有效。出于某种原因,我不得不添加重载的
常量迭代器begin()const{return _data.cbegin();}
和相应的
end()
,因为基于范围的for循环不会自动切换到
cbegin()
方法。
#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;
}