2017-08-17 99 views
0

我有线性代数的类,特别是矢量和矩阵。这些包含其他std :: vectors(或std :: maps)作为它们的'数据'字段。C++ STL;迭代包含STL容器的类吗?

在基于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工作。

+0

什么是“行”?什么是_VectorContents?请创建一个[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)向我们展示。 –

+1

在一个不相关的说明中,所有以下划线开头,后面跟着大写字母的符号(例如'_VectorContents')在所有作用域中保留。请参阅[这个老问题和它的答案](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier)了解更多信息。 –

+0

对不起,应该是一个更好的例子。感谢您对下划线的评论,我确实将它用于所有我的成员变量。 –

回答

1

的问题是,Bconst,但幅度-for循环仅使用beginend(不cbegincend)和你的beginend函数没有重载是const。这是一个问题,因为只有在const对象上才能调用标记为const的功能。

解决方法很简单:只需添加这种重载

std::vector<double>::const_iterator begin() const; 

std::vector<double>::const_iterator end() const; 

这些重载的实施将是一样的,作为非const功能。