Open alexey-malov opened 7 years ago
new (m_end) T (value);
T& operator[](size_t index)
{
if (index >= GetSize())
{
throw std::out_of_range("Index out of range");
}
return *(m_begin + index);
}
void Clear()
{
DeleteItems(m_begin, m_end);
m_begin = nullptr;
m_end = nullptr;
m_endOfCapacity = nullptr;
}
T *p = static_cast<T*>(malloc(memSize));
template<typename T>
class CMyIterator : public std::iterator<std::bidirectional_iterator_tag, T>
[x] Деструктор для итератора не нужен, т.к. итератор не владеет памятью контейнера. Имело бы смысл делать деструктор в итераторе, если бы он для целей отладки сообщал своему контейнеру о своем разрушении, а контейнер бы вел учет "живых" итераторов и помечал их как невалидные после выполнения операций, делающих их невалидными.
[ ] По сходной причине не нужен конструктор копирования и оператор присваивания для итератора, т..к все, что делает ваш конструктор, сделал бы и сгенерированный комилятором конструктор копирования и оператор присваивания
[x] Т.к. у массива должен быть итератор произвольного доступа, надо реализовать операции адресной арифметики:
Сложение итератора с числом и числа с итератором дает
Разность итераторов дает число
Разность итератора и числа дает итератор
Кроме + и - должны быть соответствующие операции += и -=
[x] Методы begin и end, а также rbegin и rend должны иметь константные версии, которые бы возвращали аналог crbegin/crend/cbegin/cend
[ ] Для них должны быть написаны тесты. (приводите массив к const CMyArray
CMyArray<int> arr;
CMyArray<int> const& carr = arr;
операции над carr будут вызывать коснтантные версии методов.
2>c:\teaching\2016\ips\lihachev\oop2016\lab7\myarraytests\myarraytests.cpp(96): warning C4267: 'initializing': conversion from 'size_t' to 'int', possible loss of data
2>c:\teaching\2016\ips\lihachev\oop2016\lab7\myarraytests\myarraytests.cpp(139): warning C4267: '=': conversion from 'size_t' to 'int', possible loss of data
2>c:\teaching\2016\ips\lihachev\oop2016\lab7\myarraytests\myarraytests.cpp(170): warning C4267: 'initializing': conversion from 'size_t' to 'int', possible loss of data
2>c:\teaching\2016\ips\lihachev\oop2016\lab7\myarraytests\myarraytests.cpp(171): warning C4267: 'initializing': conversion from 'size_t' to
void Clear()
{
DestroyItems(m_begin, m_end);
}
void Resize()
{
m_end = m_endOfCapacity;
}
[ ] СУществующие код не работает
[ ] Resize должен принимать количество аргументов. Если оно меньше, чем size, то лишние элементы должны удалиться (выкапывание картошник). End должен передвинуться в конец заполненной области. Если оно равно size, то ничего не делаем. Если оно между size и capacity (включительно), то область между end и new end Должна заполниться значениями по умолчанию Если она больше чем capacity, надо выделить новую память, скопировать туда сущесествующие элементы, заполнить остальное значениями по умолчанию, потом удалить старое.
CMyIterator& operator-(CMyIterator<T> const & other) const
{
return m_pointer - other.m_pointer;
}
CMyIterator& operator=(const CMyIterator & it)
{
m_pointer = it.m_pointer;
return *this;
}
T& operator[](ptrdiff_t index) const
{
return *(m_pointer + index);
}
CMyIterator& operator+=(ptrdiff_t n)
{
m_ptr += n;
return *this;
}
CMyIterator& operator-=(ptrdiff_t n)
{
return *this += -n;
}
CMyIterator const operator+(ptrdiff_t n) const
{
return m_pointer + n;
}
CMyIterator& operator-(CMyIterator<T> const & other) const
{
return m_pointer - other.m_pointer;
}
bool operator<(CMyIterator const& other) const
{
return m_pointer < other.m_pointer;
}
bool operator>(CMyIterator const& other) const
{
return m_pointer > other.m_pointer;
}
bool operator<=(CMyIterator const& other) const
{
return m_pointer <= other.m_pointer;
}
bool operator>=(CMyIterator const& other) const
{
return m_pointer >= other.m_pointer;
}
CMyIterator operator-(ptrdiff_t n) const
{
return m_pointer - n;
}