devDevil
Erfahrenes Mitglied
(1) #pragma comment erlaubt es das ganze etwas zu beschleunigen, aber im Grunde ist das Verhalten das eines Include-Guards.
(2) Die Funktion ist überflüssig, aber wo ich schon nen Namensraum draus gemacht hab wollt ich's vollständig haben und normal sollte man die beiden Funktionen (inkl. namespace) dann in einen extra Header packen.
(3) Ehm das ist ganz einfach. std::list<T> hat ein Typedef nahmens value_type, dass eben genau dieses T ist
. Demnach wird dann std::list<int*>::value_type zu int* aufgelöst
... Das ist auch der Grund der Namensvergabe bei DynArray ![Wink ;) ;)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f609.png)
So bei dem Code fehlten doch nur paar ')' und noch ein const_iterator. Eh und bei ostream war out und " " vertauscht
Aber hey ich weiß auch nicht alle Parameter von irgendwelchen std.-Methoden auswendig ![Big grin :D :D](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f600.png)
So sollte das eigtl. ganz gut funktionieren
Probleme:
(1) Es fehlt eine Iterator-Klasse (sonst kommst de mit std.-Funktionen nichtmehr weit
)
(2) Es müssen alle const-Versionen von operator[] und at usw. noch geschrieben werden.
(3) stream-oeprator hat da eigtl. nicht's zu suchen. (local, usw.) sondern lieber (1)
(2) Die Funktion ist überflüssig, aber wo ich schon nen Namensraum draus gemacht hab wollt ich's vollständig haben und normal sollte man die beiden Funktionen (inkl. namespace) dann in einen extra Header packen.
(3) Ehm das ist ganz einfach. std::list<T> hat ein Typedef nahmens value_type, dass eben genau dieses T ist
![Wink ;) ;)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f609.png)
![Stick out tongue :P :P](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f61b.png)
![Wink ;) ;)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f609.png)
So bei dem Code fehlten doch nur paar ')' und noch ein const_iterator. Eh und bei ostream war out und " " vertauscht
![Wink ;) ;)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f609.png)
![Big grin :D :D](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f600.png)
C++:
#if !defined DYNARRAY_HPP__INCLUDED
#define DYNARRAY_HPP__INCLUDED
#pragma once
#include <iostream>
#include <list>
#include <stdexcept>
#include <algorithm>
#include <iterator>
namespace memory
{
template <typename _PtrT>
inline void safe_delete_arr(_PtrT& ptr)
{
delete [] ptr;
ptr = NULL;
}
template <typename _PtrT>
inline void safe_delete_ptr(_PtrT& ptr)
{
delete ptr;
ptr = NULL;
}
}; // memory
template<typename _ValueT, int PartSize = 20>
class DynArray
{
public:
typedef _ValueT value_type;
typedef std::list<value_type*> storage_type;
typedef std::size_t size_type;
DynArray()
: m_index(0), m_data(new value_type[PartSize])
{}
~DynArray()
{
if (!m_storage.empty())
std::for_each(m_storage.begin(), m_storage.end(), memory::safe_delete_arr<typename storage_type::value_type>);
memory::safe_delete_arr(m_data);
}
const size_type size() const { return (m_storage.size() * PartSize + m_index); }
value_type& operator[](const std::size_t rhs)
{
if (rhs >= size()) throw std::out_of_range("index");
if (rhs > (size() - m_index)) return m_data[rhs % PartSize];
storage_type::const_iterator it(m_storage.begin());
std::advance(it, static_cast<std::size_t>(rhs / PartSize));
return (*it)[rhs % PartSize];
}
void insert(value_type const& value)
{
if (m_index >= PartSize)
{
m_storage.push_back(m_data);
m_data = new value_type[PartSize];
m_index = 0;
}
m_data[m_index++] = value;
}
template<typename _ValueT, int PartSize>
friend std::ostream& operator<< (std::ostream& out, DynArray<_ValueT, PartSize> const& rhs)
{
DynArray<_ValueT, PartSize>::storage_type const& storage(rhs.m_storage);
if (!storage.empty())
{
for (DynArray<_ValueT, PartSize>::storage_type::const_iterator it(storage.begin()); it != storage.end(); ++it)
{
std::copy(*it, (*it) + PartSize, std::ostream_iterator<_ValueT>(out, " "));
out << "\n";
}
}
std::copy(rhs.m_data, rhs.m_data + rhs.m_index, std::ostream_iterator<_ValueT>(out, " "));
return out;
}
private:
storage_type m_storage;
size_type m_index;
typename storage_type::value_type m_data;
};
#endif // DYNARRAY_HPP__INCLUDE
![Wink ;) ;)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f609.png)
Probleme:
(1) Es fehlt eine Iterator-Klasse (sonst kommst de mit std.-Funktionen nichtmehr weit
![Wink ;) ;)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f609.png)
(2) Es müssen alle const-Versionen von operator[] und at usw. noch geschrieben werden.
(3) stream-oeprator hat da eigtl. nicht's zu suchen. (local, usw.) sondern lieber (1)