C++11 C++;STL;迭代包含STL容器的类?

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

我有线性代数的课程,特别是向量和矩阵。其中包含std::Vector(或std::maps)作为其“数据”字段

在基于范围的for循环中迭代这些是很容易的。但我希望将这些字段设置为私有字段,并使对自定义类的迭代更加自然,这样我就可以在类本身上执行基于范围的for循环

我试着查看std::vector.begin()等的函数定义。然后我尝试以这样一种方式来实现它,即所有迭代器对象都是从std::vector字段中forwadded的,但没有效果。当我尝试迭代类的常量实例时,使用以下示例

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;