vector — c ++: const_iterator и цикл for-each

Я делаю свою собственную реализацию Vector в C ++. Это вопрос из двух частей.

Часть 1. При попытке выполнить итерацию по вектору мои итераторы begin () и end () не могут обработать входные аргументы. Ниже вся моя реализация Vector.h:

    class iterator{
public:

typedef std::random_access_iterator_tag iterator_category;
typedef T value_type;

Vector<T>* ptr;
uint64_t position;
COMLINK slave;

void init(void){
ptr = nullptr;
position = 0;
}
void copy(const iterator& i){
init();
ptr = i.ptr;
position = i.position;
slave = i.slave;
}
void move(iterator&& i){
init();
std::swap(ptr, i.ptr);
std::swap(position, i.position);
std::swap(slave, i.slave);
}

iterator(void){
init();
}
iterator(const iterator& q){
copy(q);
}
explicit iterator(Vector<T>* v, uint64_t offset){
init();
ptr = v;
position = offset;
slave = v->master;
}
T& operator*(void){
if ((position >= ptr->len) || ((ptr->buffer + position) < ptr->elem))throw invalid_iterator(invalid_iterator::SEVERE);
else if (slave.move_cnt != ptr->master.move_cnt) throw invalid_iterator(invalid_iterator::MODERATE);
else if (slave.alter_cnt != ptr->master.alter_cnt) throw invalid_iterator(invalid_iterator::MILD);
else if (slave.position_cnt != ptr->master.position_cnt) throw invalid_iterator(invalid_iterator::WARNING);
return *(ptr->elem + position);
}
bool operator==(const iterator& rhs){
return (ptr == rhs.ptr) && (position == rhs.position) && (slave == rhs.slave);
}
bool operator!=(const iterator& rhs){
return !((*this) == rhs);
}
iterator& operator=(const iterator& rhs){
copy(rhs);
return *this;
}
iterator& operator++(void){
position++;
return *this;
}
iterator& operator--(void){
position--;
return *this;
}
iterator operator+(uint64_t i){ // p + i
iterator temp(*this);
temp.position += i;
return temp;
}
iterator operator-(uint64_t i){ // p - i
iterator temp(*this);
temp.position -= i;
return temp;
}
uint64_t operator-(const iterator& q){
return position - q.position;
}
};

class const_iterator : public iterator {
public:
Vector<T>* const ptr;

void init(void){
ptr = nullptr;
position = 0;
}
void copy(const_iterator& i){
init();
ptr = i.ptr;
position = i.position;
slave = i.slave;
}
void copy(iterator& i){
init();
ptr = i.ptr;
position = i.position;
slave = i.slave;
}
void move(const_iterator&& i){
init();
std::swap(ptr, i.ptr);
std::swap(position, i.position);
std::swap(slave, i.slave);
}
void move(iterator&& i){
init();
std::swap(ptr, i.ptr);
std::swap(position, i.position);
std::swap(slave, i.slave);
}

const_iterator(void){
init();
}
const_iterator(const_iterator& i){
copy(i);
}
explicit const_iterator(Vector<T>* const v, uint64_t offset){
init();
ptr = v;
position = offset;
slave = v->master;
}
const_iterator(iterator& i){
copy(i);
}
const T& operator*(void){
if ((position >= ptr->len) || ((ptr->buffer + position) < ptr->elem))throw invalid_iterator(invalid_iterator::SEVERE);
else if (slave.move_cnt != ptr->master.move_cnt) throw invalid_iterator(invalid_iterator::MODERATE);
else if (slave.alter_cnt != ptr->master.alter_cnt) throw invalid_iterator(invalid_iterator::MILD);
else if (slave.position_cnt != ptr->master.position_cnt) throw invalid_iterator(invalid_iterator::WARNING);
return *(ptr->elem + position);
}
const_iterator& operator=(iterator& i){
copy(i);
return *this;
}
};

И это функции beign () и end () в векторе:

    iterator& begin(){
return iterator(this, 0);
}

const_iterator& begin() const{
return const_iterator(this, 0);
}

iterator& end(){
return iterator(this, len);
}

const_iterator& end() const{
return const_iterator(this, len);
}

И … наконец (извините за длину) … вот тестовый код, вызывающий ошибку компиляции:

const Vector<int32_t>& y = x;
int32_t s = 0;
for (const auto& v : y) {
s += v;
}

Я получаю ошибку:

Warning 3   warning C4172: returning address of local variable or temporary c:\users\alexander\documents\visual studio 2013\projects\vectorcontainerphasec_debug\vector.h   319 1   VectorContainerPhaseC_Debug
Error   4   error C2665: 'epl::Vector<int>::const_iterator::const_iterator' : none of the 4 overloads could convert all the argument types  c:\users\alexander\documents\visual studio 2013\projects\vectorcontainerphasec_debug\vector.h   323 1   VectorContainerPhaseC_Debug

Я искал эту проблему часами и не могу найти решение. Какие-нибудь советы?

Часть 2: Есть ли другой способ реализовать const_iterator, чем я делал выше? Мне кажется избыточным переопределять так много функций от итератора до const_iterator. Мне даже нужно создать класс const_iterator?

5

Решение

Вы, вероятно, хотите, чтобы ваш const_iterator указать на const Vector, Вы также должны настроить свой конструктор, как показано ниже:

class const_iterator : public iterator {
public:
const Vector<T>* const ptr;

...
explicit const_iterator(const Vector<T>* v, uint64_t offset){
...
}

Таким образом, ваш конструктор const_iterator должен вызываться в вашем диапазоне для итерации.
Увидеть Разница между объявлениями const в C ++ если вам нужно понять детали того, как работает ключевое слово const в объявлениях указателей.

3

Другие решения

Других решений пока нет …