我已经创建了一个自定义向量,我想为它创建一个迭代器,我已经将代码简化为极简主义版本,只剩下一个错误。我想修复这个错误,然后让代码做它应该做的事情,即打印数组元素的总和。
这是代码:
#include <iostream>
using namespace std;
template <class Elem>
class ArrayVector{
public :
ArrayVector(){
A = new Elem[3];
A[0] = 1;
A[1] = 2;
A[3] = 3;
ptr = &A[0];
}
const ArrayVector * begin(){
this->begin();
}
class iteratorArray{
Elem * current;
const ArrayVector * begin(){
return iteratorArray();
}
const ArrayVector* end(){
iteratorArray* end = new iteratorArray(¤t[3]);
return end;
}
iteratorArray(Elem* initLoc){
current = initLoc;
}
iteratorArray operator+(int n){
current = ¤t[n];
return *this;
}
bool operator!=(iteratorArray& obj2){
return this->current != obj2.current;
}
iteratorArray operator++(){
current = current+1;
return *this;
}
Elem& operator*(){
return *current;
}
};
Elem* A;
Elem* ptr;
};
int main() {
ArrayVector<int> vector1;
typedef ArrayVector<int>::iteratorArray iteratorArray;
int sum = 0;
for (iteratorArray p = vector1.begin(); p != vector1.end(); ++p)
sum += *p;
return sum;
}
您完全错误地实现了iteratorArray
。它应该看起来更像这样:
#include <iostream>
template <class Elem>
class ArrayVector{
private:
Elem* A;
public :
ArrayVector(){
A = new Elem[3];
A[0] = 1;
A[1] = 2;
A[2] = 3;
}
ArrayVector(const ArrayVector &src){
A = new Elem[3];
A[0] = src.A[0];
A[1] = src.A[1];
A[2] = src.A[2];
}
~ArrayVector(){
delete[] A;
}
ArrayVector& operator=(const ArrayVector &rhs){
A[0] = rhs.A[0];
A[1] = rhs.A[1];
A[2] = rhs.A[2];
return *this;
}
class iterator {
private:
Elem * current;
public:
iterator(Elem* initLoc){
current = initLoc;
}
iterator operator+(int n) const {
return iterator(current + n);
}
iterator operator-(int n) const {
return iterator(current - n);
}
iterator& operator++(){
++current;
return *this;
}
iterator operator++(int){
return iterator(current++);
}
iterator& operator--(){
--current;
return *this;
}
iterator operator--(int){
return iterator(current--);
}
iterator& operator+=(int n){
current += n;
return *this;
}
iterator& operator-=(int n){
current -= n;
return *this;
}
bool operator!=(const iterator& rhs) const{
return current != rhs.current;
}
Elem& operator*(){
return *current;
}
// and so on for other operators that a RandomAccess iterator needs to implement...
};
iterator begin(){
return iterator(A);
}
iterator end(){
return iterator(A+3);
}
};
int main() {
ArrayVector<int> vector1;
typedef ArrayVector<int>::iterator iteratorArray;
int sum = 0;
for (iteratorArray p = vector1.begin(); p != vector1.end(); ++p)
sum += *p;
std::cout << sum;
return 0;
}
实时演示
也就是说,您根本不需要自定义iterator
。您可以直接使用原始指针,它们是非常有效的迭代器。ArrayVector::begin()
可以返回A
,ArrayVector::end()
可以返回A+3
:
#include <iostream>
template <class Elem>
class ArrayVector{
private:
Elem* A;
public :
ArrayVector(){
A = new Elem[3];
A[0] = 1;
A[1] = 2;
A[2] = 3;
}
ArrayVector(const ArrayVector &src){
A = new Elem[3];
A[0] = src.A[0];
A[1] = src.A[1];
A[2] = src.A[2];
}
~ArrayVector(){
delete[] A;
}
ArrayVector& operator=(const ArrayVector &rhs){
A[0] = rhs.A[0];
A[1] = rhs.A[1];
A[2] = rhs.A[2];
return *this;
}
typedef Elem* iterator;
iterator begin(){
return A;
}
iterator end(){
return A+3;
}
};
int main() {
ArrayVector<int> vector1;
typedef ArrayVector<int>::iterator iteratorArray;
int sum = 0;
for (iteratorArray p = vector1.begin(); p != vector1.end(); ++p)
sum += *p;
std::cout << sum;
return 0;
}
实时演示
这是您程序的一个版本,经过了足够的更改,可以正常运行。我将迭代器移出并将其作为模板,因为它并不真正依赖于ArrayVector
。迭代程序是按值复制的。你可以在这里看到一个工作版本。
#include <iostream>
using namespace std;
template <class Elem>
class iteratorArray{
Elem * current;
public:
iteratorArray(Elem* initLoc){
current = initLoc;
}
iteratorArray operator+(int n){
current = ¤t[n];
return *this;
}
bool operator!=(iteratorArray const& obj2){
return this->current != obj2.current;
}
iteratorArray operator++(){
current = current+1;
return *this;
}
Elem& operator*(){
return *current;
}
};
template <class Elem>
class ArrayVector{
public :
ArrayVector(){
A = new Elem[3];
A[0] = 1;
A[1] = 2;
A[2] = 3;
ptr = &A[0];
}
const iteratorArray<Elem> begin(){
return iteratorArray<Elem>(ptr);
}
const iteratorArray<Elem> end(){
return iteratorArray<Elem>(ptr + 3);
}
Elem* A;
Elem* ptr;
};