[C++] Szablon tablicy wielowymiarowej
-
- Użytkownik
- Posty: 6607
- Rejestracja: 16 sty 2007, o 19:42
- Płeć: Mężczyzna
- Podziękował: 119 razy
- Pomógł: 1823 razy
[C++] Szablon tablicy wielowymiarowej
WITAM!
Mam napisac szablon tablcy wielowymiarowej z typem elementow jako parametrem szablonu. Liczba wymiarow ma byc zalezna od konstruktora. I tutaj rodzi sie mi pytanie. Jak w takim razie zadeklarowac 'zalazek tej tablicy' (czyt. wskaznik) w klasie?? Bo przeciez nie wiadomo ile ma miec wymiarow, tak wiec moze to byc wskaznik, wskaznik na wskaznik, itd... Ma ktos jakis pomysl?? Z gory dzieki za rady. POZDRO
Mam napisac szablon tablcy wielowymiarowej z typem elementow jako parametrem szablonu. Liczba wymiarow ma byc zalezna od konstruktora. I tutaj rodzi sie mi pytanie. Jak w takim razie zadeklarowac 'zalazek tej tablicy' (czyt. wskaznik) w klasie?? Bo przeciez nie wiadomo ile ma miec wymiarow, tak wiec moze to byc wskaznik, wskaznik na wskaznik, itd... Ma ktos jakis pomysl?? Z gory dzieki za rady. POZDRO
- kadiii
- Użytkownik
- Posty: 642
- Rejestracja: 20 gru 2005, o 21:04
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Pomógł: 130 razy
[C++] Szablon tablicy wielowymiarowej
Powiem ci, ze nic sensownego oprócz zrobienia tablicy wielowymiarowej w konwencji tablicy jednowymiarowej i odpowiednie wyliczanie indeksów nie przychodzi mi do głowy. To nawet pomijając te szablony to wykreowanie takiej tablicy ze zmienną liczbą wymiarów i jakoś sensownie ułożonych w pamięci. Jestem ciekaw rozwiązania, sam jak coś jutro wymyślę bardziej wypoczęty to się podzielę. Pozdro
-
- Użytkownik
- Posty: 6607
- Rejestracja: 16 sty 2007, o 19:42
- Płeć: Mężczyzna
- Podziękował: 119 razy
- Pomógł: 1823 razy
[C++] Szablon tablicy wielowymiarowej
No wlasnie tego sie obawialem :/ No ale coz bede narazie probowal tak kombinowac, a co z tego wyjdzie to zobaczymy Jednak jak na cos innego wpadniesz - smialo pisz Oczywiscie plusik za tworcza odpowiedz POZDRO
-
- Użytkownik
- Posty: 311
- Rejestracja: 15 mar 2007, o 16:52
- Płeć: Mężczyzna
- Lokalizacja: Lublin
- Podziękował: 28 razy
- Pomógł: 54 razy
[C++] Szablon tablicy wielowymiarowej
Ja proponowałbym zrobić coś takiego:
Nie wiem czy o to Ci dokładnie chodziło ale mam nadzieje, że pomogłem.
Kod: Zaznacz cały
#include <iostream>
using namespace std;
template <typename T, int N>
class arrayN
{
public:
arrayN(int inSize = 5);
arrayN(const arrayN<T, N>& src);
~arrayN();
arrayN<T, N>& operator=(const arrayN<T, N>& rhs);
arrayN<T, N - 1>& operator[](int x);
const arrayN<T, N - 1>& operator[](int x) const;
private:
void copy(const arrayN<T, N>& src);
arrayN<T, N - 1>* mElements;
int mSize;
};
template <typename T>
class arrayN<T, 1>
{
public:
arrayN(int inSize = 5);
arrayN(const arrayN<T, 1>& src);
~arrayN();
arrayN<T, 1>& operator=(const arrayN<T, 1>& rhs);
T& operator[](int x);
const T& operator[](int x) const;
private:
void copy(const arrayN<T, 1>& src);
T* mElements;
int mSize;
};
template <typename T, int N>
arrayN<T, N>::arrayN(int inSize) : mSize(inSize)
{
mElements = new arrayN<T, N - 1>[mSize];
for(int i = 0; i < mSize; ++i) {
arrayN<T, N - 1>* newArray = new arrayN<T, N - 1>[mSize];
}
}
template <typename T, int N>
arrayN<T, N>::arrayN(const arrayN<T, N>& src)
{
copy(src);
}
template <typename T, int N>
arrayN<T, N>::~arrayN()
{
delete[] mElements;
}
template <typename T, int N>
arrayN<T, N>& arrayN<T, N>::operator=(const arrayN<T, N>& rhs)
{
if(this == &rhs) {
return *this;
}
delete[] mElements;
copy(rhs);
return *this;
}
template <typename T, int N>
arrayN<T, N - 1>& arrayN<T, N>::operator [](int x)
{
return mElements[x];
}
template <typename T, int N>
const arrayN<T, N - 1>& arrayN<T, N>::operator [](int x) const
{
return mElements[x];
}
template <typename T, int N>
void arrayN<T, N>::copy(const arrayN<T, N>& src)
{
mSize = src.mSize;
mElements = new arrayN<T, N - 1>[mSize];
for(int i = 0; i < mSize; ++i) {
mElements[i] = src.mElements[i];
}
}
template <typename T>
arrayN<T, 1>::arrayN(int inSize) : mSize(inSize)
{
mElements = new T[mSize];
}
template <typename T>
arrayN<T, 1>::arrayN(const arrayN<T,1> &src)
{
copy(src);
}
template <typename T>
arrayN<T, 1>::~arrayN()
{
delete[] mElements;
}
template <typename T>
arrayN<T, 1>& arrayN<T, 1>::operator=(const arrayN<T,1> &rhs)
{
if(this == &rhs) {
return *this;
}
delete[] mElements;
copy(rhs);
return *this;
}
template <typename T>
T& arrayN<T, 1>::operator [](int x)
{
return mElements[x];
}
template <typename T>
const T& arrayN<T, 1>::operator [](int x) const
{
return mElements[x];
}
template <typename T>
void arrayN<T, 1>::copy(const arrayN<T, 1>& src)
{
mSize = src.mSize;
mElements = new T[mSize];
for(int i = 0; i < mSize; ++i) {
mElements[i] = src.mElements[i];
}
}
int main(int argc, char** argv)
{
arrayN<int, 3> a(3);
arrayN<int, 3> b(3);
a[2][2][2] = 1;
b = a;
arrayN<int, 3> c = b;
cout << c[2][2][2] << endl;
cout << endl;
return 0;
}
-
- Użytkownik
- Posty: 6607
- Rejestracja: 16 sty 2007, o 19:42
- Płeć: Mężczyzna
- Podziękował: 119 razy
- Pomógł: 1823 razy
[C++] Szablon tablicy wielowymiarowej
Naprawde wielkie dzieki za tyle kodu Oczywiscie wszystko dziala, jednak u mnie to ma wygladac inaczej, tj:
ma tworzyc tablice wielowymiarowa o 3 wymiarach (0 konczy). A odwolywanie sie do elementow ma sie odbywac za pomoca operatora (), czyli np:
POZDRO
Kod: Zaznacz cały
array<int> tablica3(2,3,4,0);
Kod: Zaznacz cały
tablica3(1,2,3)=123;
int liczba=tablica3(0,0,0);
-
- Użytkownik
- Posty: 311
- Rejestracja: 15 mar 2007, o 16:52
- Płeć: Mężczyzna
- Lokalizacja: Lublin
- Podziękował: 28 razy
- Pomógł: 54 razy
[C++] Szablon tablicy wielowymiarowej
Acha to zobacz coś takiego:
Warto dać jeszcze jakieś sprawdzanie czy 0 wystąpi np. max do 10 parametrów.
Kod: Zaznacz cały
#include <iostream>
#include <cstdarg>
using namespace std;
int add(int v = 0, ...)
{
int value = v, result = v;
va_list va;
va_start(va, v);
while (value != 0) {
value = va_arg(va, int);
result += value;
}
va_end(va);
return result;
}
int main(int argc, char** argv)
{
int sum;
sum = add();
cout << sum << endl;
sum = add(0);
cout << sum << endl;
sum = add(1, 2, 3, 0);
cout << sum << endl;
sum = add(-2, 4, -4, -6, 8, 10, 0);
cout << sum << endl;
cout << endl;
return 0;
}