我有线性代数的类,特别是矢量和矩阵。这些包含其他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工作。
什么是“行”?什么是_VectorContents?请创建一个[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)向我们展示。 –
在一个不相关的说明中,所有以下划线开头,后面跟着大写字母的符号(例如'_VectorContents')在所有作用域中保留。请参阅[这个老问题和它的答案](http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier)了解更多信息。 –
对不起,应该是一个更好的例子。感谢您对下划线的评论,我确实将它用于所有我的成员变量。 –