C++11 C++;STL;迭代包含STL容器的类?
我有线性代数的课程,特别是向量和矩阵。其中包含std::Vector(或std::maps)作为其“数据”字段 在基于范围的for循环中迭代这些是很容易的。但我希望将这些字段设置为私有字段,并使对自定义类的迭代更加自然,这样我就可以在类本身上执行基于范围的for循环 我试着查看std::vector.begin()等的函数定义。然后我尝试以这样一种方式来实现它,即所有迭代器对象都是从std::vector字段中forwadded的,但没有效果。当我尝试迭代类的常量实例时,使用以下示例C++11 C++;STL;迭代包含STL容器的类?,c++11,vector,stl,iterator,C++11,Vector,Stl,Iterator,我有线性代数的课程,特别是向量和矩阵。其中包含std::Vector(或std::maps)作为其“数据”字段 在基于范围的for循环中迭代这些是很容易的。但我希望将这些字段设置为私有字段,并使对自定义类的迭代更加自然,这样我就可以在类本身上执行基于范围的for循环 我试着查看std::vector.begin()等的函数定义。然后我尝试以这样一种方式来实现它,即所有迭代器对象都是从std::vector字段中forwadded的,但没有效果。当我尝试迭代类的常量实例时,使用以下示例 int m
int main() {
AlgebraLib::Vector A(4, true);
A[0] = 4;
A[1] = 5;
A[2] = 6;
A[3] = 7;
for (auto &&item : A) {
std::cout << item << std::endl;
}
const AlgebraLib::Vector B = A;
for (auto &&item : B) {
std::cout << item << std::endl;
}
return EXIT_SUCCESS;
}
基本上,所有迭代器的定义如下:
std::vector<double>::iterator Vector::begin() {
return _VectorContents.begin();
}
std::vector<double>::iterator Vector::end() {
return _VectorContents.end();
}
std::vector<double>::reverse_iterator Vector::rbegin() {
return _VectorContents.rbegin();
}
std::vector<double>::reverse_iterator Vector::rend() {
return _VectorContents.rend();
}
std::vector<double>::const_iterator Vector::cbegin() const noexcept{
return _VectorContents.cbegin();
}
std::vector<double>::const_iterator Vector::cend() const noexcept{
return _VectorContents.cend();
}
std::vector<double>::const_reverse_iterator Vector::crbegin() const noexcept{
return _VectorContents.crbegin();
}
std::vector<double>::const_reverse_iterator Vector::crend() const noexcept{
return _VectorContents.crend();
}
std::vector::iterator vector::begin(){
返回向量contents.begin();
}
std::vector::iterator vector::end(){
返回_VectorContents.end();
}
std::vector::reverse_迭代器vector::rbegin(){
返回_VectorContents.rbegin();
}
std::vector::reverse_迭代器vector::rend(){
返回_VectorContents.rend();
}
std::vector::const_迭代器vector::cbegin()const noexcept{
返回_VectorContents.cbegin();
}
std::vector::const_迭代器vector::cend()const noexcept{
返回_VectorContents.cend();
}
std::vector::const\u reverse\u迭代器vector::crbegin()const noexcept{
返回_VectorContents.crbegin();
}
std::vector::const\u reverse\u迭代器vector::crend()const noexcept{
返回向量contents.crend();
}
在我的标题Vector.hpp中:
// Iterators
std::vector<double>::iterator begin();
std::vector<double>::iterator end();
std::vector<double>::reverse_iterator rbegin();
std::vector<double>::reverse_iterator rend();
std::vector<double>::const_iterator cbegin() const noexcept;
std::vector<double>::const_iterator cend() const noexcept;
std::vector<double>::const_reverse_iterator crbegin() const noexcept;
std::vector<double>::const_reverse_iterator crend() const noexcept;
//迭代器
std::vector::迭代器begin();
std::vector::迭代器end();
std::vector::reverse_迭代器rbegin();
std::vector::reverse_迭代器rend();
std::vector::const_迭代器cbegin()const noexcept;
std::vector::const_迭代器cend()const noexcept;
std::vector::const_reverse_迭代器crbegin()const noexcept;
std::vector::const\u reverse\u迭代器crend()const noexcept;
我觉得我错过了什么?我对C++是比较新的,现在我用C++ 11来工作。 < p>问题是<>代码> b/c> >代码> const ,但是循环的范围只使用<代码>开始<代码>和<代码>结束<代码>(不<代码> cRead 和<代码> cEnt/c>)而且您的
begin
和end
函数没有const
的重载。这是一个问题,因为只有标记为const
的函数才能在const
对象上调用
解决方案很简单:只需添加这样的重载
std::vector<double>::const_iterator begin() const;
std::vector<double>::const_iterator end() const;
std::vector::const\u迭代器begin()const;
std::vector::const_迭代器end()const;
这些重载的实现与非常量函数相同。什么是
行
?什么是矢量内容?请创建一个来向我们展示。在一个不相关的注释中,所有以下划线开头,后跟大写字母的符号(例如\u VectorContents
)都保留在所有范围中。请参阅以了解更多信息。对此表示抱歉,我们应该做一个更好的示例。谢谢你对下划线的评论,我确实对我所有的成员变量都使用了下划线。
std::vector<double>::const_iterator begin() const;
std::vector<double>::const_iterator end() const;