Rzadka tablica obiektow dowolnego typu.

0

Hej, tak jak w tytule. Muszę napisać klasę obsługującą bardzo dużą tablicę na obiekty dowolnego typu(powinna mieć pojemnosć ponad 1 500 000 000). Jednak niezerowych obiektów będzie w niej jedynie kilkaset.
Szukałem w internecie i zazwyczaj trafiam na bardzo duże kody które nie do końca wiem co robią. Postanowiłem więc zacząć ją pisać samemu ale nie wiem czy idę w dobrym kierunku:

Postanowiłem że uzyję mapy do przechowywania niezerowych komórek . Numery indeksu tablicy będą kluczami. Zrobiłem funkcję dodającą elementy do tablicy oraz pobierającą. Jeżeli wcześniej nie został dodany obiekt na danym indeksie to funkcja zwróci nullpointer. Czy to jest dobre rozwiązanie tego zadania czy powinienem to zrobić jakoś zupełnie inaczej? Bo kody z którymi się spotykałem miały po 300+ linijek, co one miały czego nie ma mój?

Chciałem też przeładować operator [] aby zwracał referencję do odpowiedniego obiektu w mapie aby można było korzystać z tej klasy tak jak z normalnej tablicy ale tu mam problem bo zwracając referencję nie widzę w jaki sposob uzytkownik chce z niej korzystać:
Tablica[7]=obiekt1
czy
Tablica[7]
Jeśli chciałbym umożliwić zapis to bym musiał stworzyć nowy wpis w mapie i zainicjować go nowym domyślnym obiektem żeby mógł zostać nadpisany obiektem1.
Jednak jeśli ktoś by chciał tylko odczytać to powyższe rozwiązanie by za każdym razem tworzyło nowy domyślny obiekt
Jak więc najlepiej przeładować operator [] w tej klasie?

To mój kod:

#include <iostream>
#include <map>
template<class T>

class D
{

};

class Tablica
{
private:
unsigned _rozmiar;
std::map<int, T> _mapa;
public:
	Tablica()
	{
		_rozmiar = 3000000000;
	}
	Tablica(unsigned rozmiar)
	{
		_rozmiar = rozmiar;
	}
	T * pobierz(unsigned int indeks)
	{
		auto it = _mapa.find(indeks);
		return (it != _mapa.end()) ? &(it->second) : nullptr;
	}
	void dodaj(unsigned int indeks, const T& obiekt )
	{
		_mapa[indeks] = obiekt;
	}
	
};
 
1

Dlaczego po prostu nie użyć mapy?

0

no to właśnie chyba to robię, przeczytałeś cały post? Mapa jest polem w mojej klasie:

std::map<int, T> _mapa;

ale wydaje mi się że powinna ona przypominać z zewnątrz jak najbardziej zwykłą tablicę. Więc muszę opakować tą mapę bo np gdybym użył samej mapy to nie mógł bym się odwoływać do nieistniejących indeksów żeby został zwrócony nullpointer. Tak samo jak pisałem o przeładowaniu [].

Sam do końca nie wiem o co choci autorowi zadania bo cały jego opis przedstawiłem już w pierwszym poście. Ja Własnie to tak zrozumiałem że ma to działać w ten sposób, ale możliwe że chodziło o coś innego. I to też moje pytanie o co mogło chodzić bo może ja źle interpretuje to zadanie

2

Mógłbyś, operator[] tworzy element z domyślną wartością jeśli go wcześniej nie było, ale lepiej to po prostu sprawdzić. Po prostu nie widzę sensu tworzenia osobnego typu, chyba, że chcesz zwracać jakieś proxy z przeładowanym operatorem=, ale to sporo roboty.

0

hmm, no faktycznie mapa ma przeładowane te wszysktie operatory więc wygląda na to że to gotowe rozwiązanie. Ale szukając w internecie natknąłem się na
http://4programmers.net/Forum/C_i_.NET/221176-tablica_generyczna_-_jak_to_zrobic?start=10

W c# nigdy nic nie programowałem ale autor zadania chciał zrobić chyba to samo co ja, z tego co widzę to też korzystał z jakiejś gotowej implementacji kontenera hashtable. Jest mi ktoś w stanie powiedzieć dlaczego tam była potrzeba implementacji wielu dodatkowych funkcji skoro mapa wszystko rozwiazuje?

0
tytrydsdf napisał(a):

Hej, tak jak w tytule. Muszę napisać klasę obsługującą bardzo dużą tablicę na obiekty dowolnego typu(powinna mieć pojemnosć ponad 1 500 000 000). Jednak niezerowych obiektów będzie w niej jedynie kilkaset.

1.5mld? Nawet jeśli każdy obiekt = sizeof( int ) to taka kolekcja zajmie Ci ponad 5.5GiB w dodatku większość tej pamięci będzie marnowana. Jeśli zależy Ci na ID to lepiej rozbić to na zwykłą tablicę dla tego co Ci potrzebne a indeksy mapować na ID właśnie jakąś hashmapą.

Poza tym "duża tablica na obiekty dowolnego typu" to IMHO proszenie się o kłopoty.

0

boost:
lub
std::unordered_map

A jakbyś miał to robić sam to zwykłe hash map (własne) oparte na szablonach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1