C++ 为自定义类继承std::vector::迭代器?
我正在实现一个自定义类,它包含一个STLC++ 为自定义类继承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
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;
}