c++ - 在 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(¤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;
}
推荐阅读
- mysql - 是否有可能在我的查询中添加 LIMIT 会使其变慢?
- python - pip 安装 MySQL-python 安装失败
- c# - using XmlSerializer with unknown root element
- css - Wordpress 背景图像未显示 - 在 Chrome 检查器中显示为灰色
- java - Java Spring:存储渲染的 HTML/JSP
- java - Swagger OpenAPI 3.0 - Springdoc - GroupedOpenApi 在 Spring MVC 中不起作用
- javascript - 尽管已触发挂载事件,为什么我的 Vue 应用程序不呈现?
- math - 线性公式计算
- php - 如何创建日期格式UTC php
- go - golang 应用的部署策略,如何在生产环境中运行 golang 应用