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

时间:2017-08-17 09:57:40

标签: c++11 vector stl iterator

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

在基于for循环的范围内迭代这些很容易。但是我想让这些字段变得私有,并且使我的自定义类的迭代更加自然,这样我就可以在类本身上进行基于范围的循环。

我试着查看std :: vector<> .begin()等函数的定义。然后我尝试以这样的方式实现它,即所有迭代器对象都是从std :: vector<>转发的。领域,但无济于事。当我尝试迭代我的类的常量实例时,使用以下示例;

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

...我收到以下编译错误;

error: passing ‘const AlgebraLib::Vector’ as ‘this’ argument discards qualifiers [-fpermissive]
 for (auto &&item : B) {

基本上,所有迭代器都是这样定义的:

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();
}

在我的标题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;

我觉得我在这里错过了一些东西?我对C ++比较陌生,现在我用C ++ 11工作。

1 个答案:

答案 0 :(得分:1)

问题是Bconst,但是range-for循环只使用beginend(不是cbegin和{{1} })并且您的cendbegin函数没有end的重载。这是一个问题,因为只能在const个对象上调用标记为const的函数。

解决方案很简单:只需添加此类重载

const

这些重载的实现与非const函数的实现相同。