在C++中使用带有自定义向量的迭代器



我已经创建了一个自定义向量,我想为它创建一个迭代器,我已经将代码简化为极简主义版本,只剩下一个错误。我想修复这个错误,然后让代码做它应该做的事情,即打印数组元素的总和。

这是代码:

#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(&current[3]);
return end;
}
iteratorArray(Elem* initLoc){
current = initLoc;
}
iteratorArray operator+(int n){
current = &current[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()可以返回AArrayVector::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 = &current[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;
};

最新更新